chaokunyang commented on issue #1972: URL: https://github.com/apache/fury/issues/1972#issuecomment-2569039541
> after further read, seems serializeJavaObject API already write class def. which meta are you refering to? maybe if you can help to share some context or pointer it will be much help > > * https://github.com/apache/fury/blob/b43d521fa0eb29cc97fc60f4d7bfa4171c993c6a/java/fury-core/src/main/java/org/apache/fury/Fury.java#L1072 > * https://github.com/apache/fury/blob/b43d521fa0eb29cc97fc60f4d7bfa4171c993c6a/java/fury-core/src/main/java/org/apache/fury/Fury.java#L1078 > > thank you It didn't write class def, the correct code should looks like following: ```java public void serializeJavaObject(MemoryBuffer buffer, Object obj) { try { jitContext.lock(); if (depth != 0) { throwDepthSerializationException(); } if (config.isMetaShareEnabled()) { int startOffset = buffer.writerIndex(); buffer.writeInt32(-1); // preserve 4-byte for meta start offsets. if (!refResolver.writeRefOrNull(buffer, obj)) { ClassInfo classInfo = classResolver.getOrUpdateClassInfo(obj.getClass()); classResolver.writeClass(buffer, classInfo); writeData(buffer, classInfo, obj); ``` ```java public <T> T deserializeJavaObject(MemoryBuffer buffer, Class<T> cls) { try { jitContext.lock(); if (depth != 0) { throwDepthDeserializationException(); } if (shareMeta) { readClassDefs(buffer); } T obj; int nextReadRefId = refResolver.tryPreserveRefId(buffer); if (nextReadRefId >= NOT_NULL_VALUE_FLAG) { ClassInfo classInfo; if (shareMeta) { classInfo = classResolver.readClassInfo(buffer); } else { classInfo = classResolver.getClassInfo(cls); } obj = (T) readDataInternal(buffer, classInfo); return obj; } else { return null; } ``` And when deserializing, you must register class by id to setup class mapping: ```java static BaseFury s = Fury.builder() .withRefTracking(true) .withCompatibleMode(CompatibleMode.COMPATIBLE) .requireClassRegistration(false) .serializeEnumByName(true) .buildThreadSafeFury(); static BaseFury s1 = Fury.builder() .withRefTracking(true) .withCompatibleMode(CompatibleMode.COMPATIBLE) .requireClassRegistration(false) .serializeEnumByName(true) .buildThreadSafeFury(); public static class PrivateFliedClassNumberOne { private boolean privateBoolean = true; private int privateInt = 10; private String privateString = "notNull"; private Map<String, String> privateMap = ofHashMap("a", "b"); private List<String> privateList = ofArrayList("l"); private PrivateFieldSubClass privateFieldSubClass = new PrivateFieldSubClass(); } public static class PrivateFliedClassNumberTwoWithMissingField { private Map<String, String> privateMap = ofHashMap("a", "b"); private int privateInt = 10; private PrivateFieldSubClass privateFieldSubClass = new PrivateFieldSubClass(); private List<String> privateList = ofArrayList("l"); private boolean privateBoolean = true; } private static class PrivateFieldSubClass{} @Test public void test() { PrivateFliedClassNumberOne privateField = new PrivateFliedClassNumberOne(); s.register(PrivateFliedClassNumberOne.class); byte[] serialized = s.serializeJavaObject(privateField); s1.register(PrivateFliedClassNumberTwoWithMissingField.class); PrivateFliedClassNumberTwoWithMissingField privateField2 = s1.deserializeJavaObject( serialized, PrivateFliedClassNumberTwoWithMissingField.class ); } ``` -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected] --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
