From 2afec07cab439479d3e652b533db5de9a4b4867b Mon Sep 17 00:00:00 2001 From: ManuG85 Date: Thu, 27 Apr 2017 22:30:26 +0200 Subject: [PATCH 1/4] Before (de)serialization callbacks Introduced a callback to get informed about a type before an instance of it gets serialized and another one to get informed about an type id before it gets used to deserialize an object. --- NetSerializer/Settings.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/NetSerializer/Settings.cs b/NetSerializer/Settings.cs index 94880da..54b5471 100644 --- a/NetSerializer/Settings.cs +++ b/NetSerializer/Settings.cs @@ -13,6 +13,16 @@ namespace NetSerializer { public class Settings { + /// + /// Gets called when an object is going to be deserialized. + /// + public Action BeforeDeserializingObjectWithTypeId; + + /// + /// Gets called when an object is going to be serialized. + /// + public Action BeforeSerializingObjectOfType; + /// /// Array of custom TypeSerializers /// From e80b415efd164ad82044018c858fefb8f516bc03 Mon Sep 17 00:00:00 2001 From: ManuG85 Date: Thu, 27 Apr 2017 22:32:27 +0200 Subject: [PATCH 2/4] Invoke before (de)serialization callbacks --- NetSerializer/TypeSerializers/ObjectSerializer.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/NetSerializer/TypeSerializers/ObjectSerializer.cs b/NetSerializer/TypeSerializers/ObjectSerializer.cs index 9b8bbd9..0cab29b 100644 --- a/NetSerializer/TypeSerializers/ObjectSerializer.cs +++ b/NetSerializer/TypeSerializers/ObjectSerializer.cs @@ -46,6 +46,8 @@ public static void Serialize(Serializer serializer, Stream stream, object ob) var type = ob.GetType(); + serializer.Settings.BeforeSerializingObjectOfType?.Invoke(type); + SerializeDelegate del; uint id = serializer.GetTypeIdAndSerializer(type, out del); @@ -75,6 +77,8 @@ public static void Deserialize(Serializer serializer, Stream stream, out object ob = new object(); return; } + + serializer.Settings.BeforeDeserializingObjectWithTypeId?.Invoke(id); var del = serializer.GetDeserializeTrampolineFromId(id); del(serializer, stream, out ob); From 1253c752301f171f8464eff526fb534ae0ad0c03 Mon Sep 17 00:00:00 2001 From: ManuG85 Date: Thu, 27 Apr 2017 22:35:42 +0200 Subject: [PATCH 3/4] Collect used types Set before (de)serialization callbacks to collect used types. --- Test/Tester.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Test/Tester.cs b/Test/Tester.cs index 3775121..557b73c 100644 --- a/Test/Tester.cs +++ b/Test/Tester.cs @@ -9,6 +9,14 @@ namespace Test { class Tester { + private static HashSet m_serializedTypes = new HashSet(); + + private static HashSet m_deserializedTypeIds = new HashSet(); + + public static IEnumerable SerializedTypes => m_serializedTypes; + + public static IEnumerable DeserializedTypeIds => m_deserializedTypeIds; + public static NS.Serializer CreateSerializer() { var types = GetKnownTypes().ToArray(); @@ -18,6 +26,8 @@ public static NS.Serializer CreateSerializer() var settings = new NS.Settings() { CustomTypeSerializers = new NS.ITypeSerializer[] { new TriDimArrayCustomSerializer() }, + BeforeSerializingObjectOfType = type => m_serializedTypes.Add(type), + BeforeDeserializingObjectWithTypeId = id => m_deserializedTypeIds.Add(id) }; var serializer = new NS.Serializer(types, settings); From 9d26a4a8ef520b70f384d4ced52d9bf5e1701faf Mon Sep 17 00:00:00 2001 From: ManuG85 Date: Thu, 27 Apr 2017 22:41:56 +0200 Subject: [PATCH 4/4] Print types to check (de)serialization callbacks Print the types used for serialization and the type ids used while deserializing objects. --- Test/Program.cs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Test/Program.cs b/Test/Program.cs index 0b5b0e7..87107e3 100644 --- a/Test/Program.cs +++ b/Test/Program.cs @@ -41,6 +41,22 @@ static void Main(string[] args) foreach (var thread in threads) thread.Join(); + + Console.WriteLine(); + Console.WriteLine("Serialized objects of types:"); + foreach (var type in Tester.SerializedTypes.OrderBy(x => x.FullName)) + { + Console.WriteLine(type.FullName); + } + + Console.WriteLine(); + Console.WriteLine("Deserialized objects with type ids:"); + foreach (var id in Tester.DeserializedTypeIds.OrderBy(x => x)) + { + Console.WriteLine(id); + } + + Console.ReadKey(); } static bool ParseArgs(string[] args)