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

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


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

commit 76cd99e36a286d33e818454103a5e717b9c445c1
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 22c3cf3..f792a72 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -29,6 +29,7 @@ Bug Fixes:
 
 CAY-2332 Property API: unable to use eq() and in() methods for toMany 
relationships
 CAY-2509 Result of resolving lazily faulted relationships can be out-of-date
+CAY-2547 CayenneDataObject serialization issue
 
 ----------------------------------
 Release: 4.1.M3
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