diff options
| author | Roy Ben Shabat <Roy.mail.net@gmail.com> | 2020-03-30 00:56:02 +0300 |
|---|---|---|
| committer | Roy Ben Shabat <Roy.mail.net@gmail.com> | 2020-03-30 00:56:02 +0300 |
| commit | 091a4bdeb2feadb4962c6be5deb367ab56d81707 (patch) | |
| tree | 289a672287063108b851b2831d4c699dcddd26d9 /Software/Visual_Studio/Tango.Transport/GenericMessageSerializer.cs | |
| parent | 3d6a882cf14f36297d8b379e0fdf65376064edf7 (diff) | |
| download | Tango-091a4bdeb2feadb4962c6be5deb367ab56d81707.tar.gz Tango-091a4bdeb2feadb4962c6be5deb367ab56d81707.zip | |
Implemented PPC Updates & Packages.
Moved PPC/FSE interfaces to PPC.Shared.
Changes Generic Serialization to json.
Diffstat (limited to 'Software/Visual_Studio/Tango.Transport/GenericMessageSerializer.cs')
| -rw-r--r-- | Software/Visual_Studio/Tango.Transport/GenericMessageSerializer.cs | 137 |
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; + } + } +} |
