From be4d966e56de09455673ea7817604d803517b5bd Mon Sep 17 00:00:00 2001 From: leventov Date: Thu, 5 Feb 2015 07:14:25 +0700 Subject: [PATCH] Imporoved SerializationBuilder own serialization --- .../chronicle/map/SerializationBuilder.java | 28 +++++++++++++++++-- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/openhft/chronicle/map/SerializationBuilder.java b/src/main/java/net/openhft/chronicle/map/SerializationBuilder.java index 04f5a8c64..ca22cc032 100644 --- a/src/main/java/net/openhft/chronicle/map/SerializationBuilder.java +++ b/src/main/java/net/openhft/chronicle/map/SerializationBuilder.java @@ -34,9 +34,7 @@ import net.openhft.lang.threadlocal.ThreadLocalCopies; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.io.Externalizable; -import java.io.IOException; -import java.io.Serializable; +import java.io.*; import java.lang.reflect.Modifier; import java.math.BigDecimal; import java.math.BigInteger; @@ -50,6 +48,7 @@ import static net.openhft.chronicle.hash.serialization.internal.SizeMarshallers. import static net.openhft.chronicle.map.Objects.hash; final class SerializationBuilder implements Cloneable, Serializable { + private static final long serialVersionUID = 0L; private static final Bytes EMPTY_BYTES = new ByteBufferBytes(ByteBuffer.allocate(0)); @@ -88,6 +87,8 @@ final class SerializationBuilder implements Cloneable, Serializable { private long maxSize; final boolean sizeIsStaticallyKnown; + + boolean serializesGeneratedClasses = false; @SuppressWarnings("unchecked") SerializationBuilder(Class eClass, Role role) { @@ -112,10 +113,12 @@ final class SerializationBuilder implements Cloneable, Serializable { metaInterop((MetaBytesInterop) DataValueMetaBytesInterop.forIdentity(role)); metaInteropProvider(DataValueMetaBytesInterop.interopProvider(eClass)); sizeMarshaller(constant((long) size)); + serializesGeneratedClasses = true; return; } catch (Exception e) { try { eClass = DataValueClasses.directClassFor(eClass); + serializesGeneratedClasses = true; } catch (Exception ex) { // ignore, fall through } @@ -169,6 +172,25 @@ final class SerializationBuilder implements Cloneable, Serializable { } } + private void writeObject(ObjectOutputStream out) throws IOException { + out.writeBoolean(serializesGeneratedClasses); + if (serializesGeneratedClasses) { + out.writeObject(eClass); + out.writeObject(role); + } + out.defaultWriteObject(); + } + + private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { + boolean generatedClassesSerialized = in.readBoolean(); + if (generatedClassesSerialized) { + Class eClass = (Class) in.readObject(); + Role role = (Role) in.readObject(); + new SerializationBuilder(eClass, role); + } + in.defaultReadObject(); + } + boolean possibleOffHeapReferences() { if (reader instanceof CharSequenceReader) return false;