aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Tango.Transport/GenericMessageSerializer.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Software/Visual_Studio/Tango.Transport/GenericMessageSerializer.cs')
-rw-r--r--Software/Visual_Studio/Tango.Transport/GenericMessageSerializer.cs137
1 files changed, 137 insertions, 0 deletions
diff --git a/Software/Visual_Studio/Tango.Transport/GenericMessageSerializer.cs b/Software/Visual_Studio/Tango.Transport/GenericMessageSerializer.cs
new file mode 100644
index 000000000..aa3486dc3
--- /dev/null
+++ b/Software/Visual_Studio/Tango.Transport/GenericMessageSerializer.cs
@@ -0,0 +1,137 @@
+using Google.Protobuf;
+using Newtonsoft.Json;
+using ProtoBuf;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.PMR;
+using Tango.PMR.Common;
+using Tango.PMR.Integration;
+
+namespace Tango.Transport
+{
+ public static class GenericMessageSerializer
+ {
+ public enum GenericMessageSerializerMode
+ {
+ Json,
+ Protobuf
+ }
+
+ public static GenericMessageSerializerMode Mode { get; set; }
+
+ static GenericMessageSerializer()
+ {
+ ProtoBuf.Meta.RuntimeTypeModel.Default.AutoAddMissingTypes = true;
+ ProtoBuf.Meta.RuntimeTypeModel.Default.AutoAddProtoContractTypesOnly = false;
+ ProtoBuf.Meta.RuntimeTypeModel.Default.InferTagFromNameDefault = true;
+ ProtoBuf.Meta.RuntimeTypeModel.Default.UseImplicitZeroDefaults = true;
+ }
+
+ public static object Deserialize(Type type, byte[] array)
+ {
+ if (Mode == GenericMessageSerializerMode.Json)
+ {
+ return JsonConvert.DeserializeObject(Encoding.UTF8.GetString(array), type);
+ }
+ else
+ {
+ AutoProtobuf.Build(type);
+
+ using (MemoryStream ms = new MemoryStream(array))
+ {
+ return Serializer.Deserialize(type, ms);
+ }
+ }
+ }
+
+ public static object DeserializeFromByteString(Type type, ByteString byteString)
+ {
+ if (Mode == GenericMessageSerializerMode.Json)
+ {
+ return JsonConvert.DeserializeObject(byteString.ToStringUtf8(), type);
+ }
+ else
+ {
+ AutoProtobuf.Build(type);
+ return Deserialize(type, byteString.ToByteArray());
+ }
+ }
+
+ //---------------------------------------------------------------------
+
+ public static byte[] Serialize<T>(T message)
+ {
+ if (Mode == GenericMessageSerializerMode.Json)
+ {
+ return Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(message));
+ }
+ else
+ {
+ AutoProtobuf.Build<T>();
+
+ using (MemoryStream ms = new MemoryStream())
+ {
+ Serializer.Serialize<T>(ms, message);
+ return ms.ToArray();
+ }
+ }
+ }
+
+ public static T Deserialize<T>(byte[] array)
+ {
+ if (Mode == GenericMessageSerializerMode.Json)
+ {
+ return (T)Deserialize(typeof(T), array);
+ }
+ else
+ {
+ AutoProtobuf.Build<T>();
+
+ using (MemoryStream ms = new MemoryStream(array))
+ {
+ return Serializer.Deserialize<T>(ms);
+ }
+ }
+ }
+
+ public static ByteString SerializeToByteString<T>(T message)
+ {
+ if (Mode == GenericMessageSerializerMode.Json)
+ {
+ return ByteString.CopyFromUtf8(JsonConvert.SerializeObject(message));
+ }
+ else
+ {
+ AutoProtobuf.Build<T>();
+
+ return ByteString.CopyFrom(Serialize<T>(message));
+ }
+ }
+
+ public static T DeserializeFromByteString<T>(ByteString byteString)
+ {
+ if (Mode == GenericMessageSerializerMode.Json)
+ {
+ return JsonConvert.DeserializeObject<T>(byteString.ToStringUtf8());
+ }
+ else
+ {
+ AutoProtobuf.Build<T>();
+
+ return Deserialize<T>(byteString.ToByteArray());
+ }
+ }
+
+ public static T ExtractGenericRequestFromContainer<T>(MessageContainer container) where T : class
+ {
+ var message = MessageFactory.ExtractMessageFromContainer(container);
+ var genericType = Type.GetType((message as GenericRequest).Type);
+ var innerMessage = DeserializeFromByteString(genericType, (message as GenericRequest).Data);
+ return innerMessage as T;
+ }
+ }
+}