This is an automated email from the ASF dual-hosted git repository.

ntimofeev pushed a commit to branch STABLE-4.1
in repository https://gitbox.apache.org/repos/asf/cayenne.git


The following commit(s) were added to refs/heads/STABLE-4.1 by this push:
     new c31ec4a  CAY-2547 CayenneDataObject serialization issue
c31ec4a is described below

commit c31ec4a4c49ba12da1df0cd3b4f019a0c4b2bb05
Author: Nikita Timofeev <[email protected]>
AuthorDate: Thu Feb 28 14:03:58 2019 +0300

    CAY-2547 CayenneDataObject serialization issue
---
 RELEASE-NOTES.txt                                  |  1 +
 .../java/org/apache/cayenne/CayenneDataObject.java | 17 +++++++++++
 .../apache/cayenne/DataObjectSerializationIT.java  | 34 ++++++++++++++++++++++
 3 files changed, 52 insertions(+)

diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index c5d22d5..b37e65d 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -62,6 +62,7 @@ CAY-2531 Importing same schema after Import Revert clears all 
entities in datama
 CAY-2533 Modeler: Exception on validating ObjRelationship without db path
 CAY-2535 Imposible to import stored proceedure apart from db tables
 CAY-2537 Generate DB Schema: Schema Generation Complete popup window is hidden
+CAY-2547 CayenneDataObject serialization issue
 
 ----------------------------------
 Release: 4.1.M2
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/CayenneDataObject.java 
b/cayenne-server/src/main/java/org/apache/cayenne/CayenneDataObject.java
index 3cad849..e7ac141 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/CayenneDataObject.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/CayenneDataObject.java
@@ -112,6 +112,23 @@ public class CayenneDataObject extends BaseDataObject {
                buffer.append("]");
        }
 
+       /**
+        * Serialization support.
+        */
+       private void writeObject(ObjectOutputStream out) throws IOException {
+               writeSerialized(out);
+       }
+
+       /**
+        * Serialization support.
+        */
+       private void readObject(ObjectInputStream in) throws IOException, 
ClassNotFoundException {
+               readSerialized(in);
+               if(values == null) {
+                       values = new HashMap<>();
+               }
+       }
+
        @Override
        protected void readState(ObjectInputStream in) throws IOException, 
ClassNotFoundException {
                super.readState(in);
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/DataObjectSerializationIT.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/DataObjectSerializationIT.java
index 7307402..96e7584 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/DataObjectSerializationIT.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/DataObjectSerializationIT.java
@@ -128,4 +128,38 @@ public class DataObjectSerializationIT extends ServerCase {
         assertNull(deserialized.getObjectContext());
         assertEquals(null, deserialized.getArtistName());
     }
+
+    @Test
+    public void testSerializeModifiedMapBasedObject() throws Exception {
+        ObjectId objectId = new ObjectId("test", "id", 42);
+
+        CayenneDataObject dataObject = new CayenneDataObject();
+        dataObject.setObjectContext(context);
+        dataObject.setObjectId(objectId);
+        dataObject.writePropertyDirectly("test", 123);
+        dataObject.setPersistenceState(PersistenceState.MODIFIED);
+
+        CayenneDataObject cloned = Util.cloneViaSerialization(dataObject);
+        assertEquals(PersistenceState.MODIFIED, cloned.getPersistenceState());
+        assertEquals(123, cloned.readProperty("test"));
+        assertNull(cloned.getObjectContext());
+        assertEquals(dataObject.getObjectId(), cloned.getObjectId());
+    }
+
+    @Test
+    public void testSerializeCommittedMapBasedObject() throws Exception {
+        ObjectId objectId = new ObjectId("test", "id", 42);
+
+        CayenneDataObject dataObject = new CayenneDataObject();
+        dataObject.setObjectContext(context);
+        dataObject.setObjectId(objectId);
+        dataObject.writePropertyDirectly("test", 123);
+        dataObject.setPersistenceState(PersistenceState.COMMITTED);
+
+        CayenneDataObject cloned = Util.cloneViaSerialization(dataObject);
+        assertEquals(PersistenceState.HOLLOW, cloned.getPersistenceState());
+        assertNull(cloned.readProperty("test"));
+        assertNull(cloned.getObjectContext());
+        assertEquals(dataObject.getObjectId(), cloned.getObjectId());
+    }
 }

Reply via email to