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

crazyhzm pushed a commit to branch 3.0
in repository https://gitbox.apache.org/repos/asf/dubbo.git


The following commit(s) were added to refs/heads/3.0 by this push:
     new 51529c34c5 Fix transient init (#10462)
51529c34c5 is described below

commit 51529c34c584e51f3ebaa07d8dc3953457a85522
Author: Albumen Kevin <[email protected]>
AuthorDate: Mon Aug 15 16:04:42 2022 +0800

    Fix transient init (#10462)
---
 .../org/apache/dubbo/metadata/MetadataInfo.java    |  5 ++++
 .../apache/dubbo/metadata/MetadataInfoTest.java    | 30 ++++++++++++++++++++++
 .../client/OverrideInstanceAddressURL.java         |  4 +++
 3 files changed, 39 insertions(+)

diff --git 
a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataInfo.java
 
b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataInfo.java
index b1d852c96f..645eb9e698 100644
--- 
a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataInfo.java
+++ 
b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataInfo.java
@@ -434,6 +434,11 @@ public class MetadataInfo implements Serializable {
         return new MetadataInfo(app, revision, services, initiated, 
extendParams, instanceParams, updated, subscribedServiceURLs, 
exportedServiceURLs, loader);
     }
 
+    private Object readResolve() {
+        // create a new object from the deserialized one, in order to call 
constructor
+        return new MetadataInfo(this.app, this.revision, this.services);
+    }
+
     public static class ServiceInfo implements Serializable {
         private String name;
         private String group;
diff --git 
a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/MetadataInfoTest.java
 
b/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/MetadataInfoTest.java
index f2f76f4565..ccd91deb05 100644
--- 
a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/MetadataInfoTest.java
+++ 
b/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/MetadataInfoTest.java
@@ -22,7 +22,14 @@ import org.apache.dubbo.common.utils.JsonUtils;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.lang.reflect.Field;
 import java.util.Map;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 import static 
org.apache.dubbo.common.constants.CommonConstants.APPLICATION_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;
@@ -164,6 +171,29 @@ public class MetadataInfoTest {
 
     }
 
+    @Test
+    public void testJdkSerialize() throws IOException, ClassNotFoundException, 
NoSuchFieldException, IllegalAccessException {
+        ByteArrayOutputStream byteArrayOutputStream = new 
ByteArrayOutputStream();
+        ObjectOutputStream objectOutputStream = new 
ObjectOutputStream(byteArrayOutputStream);
+        MetadataInfo metadataInfo = new MetadataInfo("demo");
+        metadataInfo.addService(url);
+        objectOutputStream.writeObject(metadataInfo);
+        objectOutputStream.close();
+        byteArrayOutputStream.close();
+        byte[] bytes = byteArrayOutputStream.toByteArray();
+
+        ByteArrayInputStream byteArrayInputStream = new 
ByteArrayInputStream(bytes);
+        ObjectInputStream objectInputStream = new 
ObjectInputStream(byteArrayInputStream);
+        MetadataInfo metadataInfo2 = (MetadataInfo) 
objectInputStream.readObject();
+        objectInputStream.close();
+
+        Assertions.assertEquals(metadataInfo, metadataInfo2);
+        Field initiatedField = 
MetadataInfo.class.getDeclaredField("initiated");
+        initiatedField.setAccessible(true);
+        Assertions.assertInstanceOf(AtomicBoolean.class, 
initiatedField.get(metadataInfo2));
+        
Assertions.assertFalse(((AtomicBoolean)initiatedField.get(metadataInfo2)).get());
+    }
+
     @Test
     public void testCal() {
         MetadataInfo metadataInfo = new MetadataInfo("demo");
diff --git 
a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/OverrideInstanceAddressURL.java
 
b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/OverrideInstanceAddressURL.java
index a06cdf2b85..c02ef138e3 100644
--- 
a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/OverrideInstanceAddressURL.java
+++ 
b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/OverrideInstanceAddressURL.java
@@ -339,6 +339,10 @@ public class OverrideInstanceAddressURL extends 
InstanceAddressURL {
         return originUrl.toString() + ", overrideParams: " + 
overrideParams.toString();
     }
 
+    private Object readResolve() {
+        // create a new object from the deserialized one
+        return new OverrideInstanceAddressURL(this.originUrl, 
this.overrideParams);
+    }
     @Override
     protected OverrideInstanceAddressURL newURL(URLAddress urlAddress, 
URLParam urlParam) {
         return new OverrideInstanceAddressURL(originUrl, overrideParams);

Reply via email to