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 | |
| 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')
4 files changed, 145 insertions, 95 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; + } + } +} diff --git a/Software/Visual_Studio/Tango.Transport/ProtoSerializer.cs b/Software/Visual_Studio/Tango.Transport/ProtoSerializer.cs deleted file mode 100644 index c974f2712..000000000 --- a/Software/Visual_Studio/Tango.Transport/ProtoSerializer.cs +++ /dev/null @@ -1,87 +0,0 @@ -using Google.Protobuf; -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 ProtoSerializer - { - static ProtoSerializer() - { - 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) - { - AutoProtobuf.Build(type); - - using (MemoryStream ms = new MemoryStream(array)) - { - return Serializer.Deserialize(type, ms); - } - } - - public static object DeserializeFromByteString(Type type, ByteString byteString) - { - AutoProtobuf.Build(type); - - return Deserialize(type, byteString.ToByteArray()); - } - - //--------------------------------------------------------------------- - - public static byte[] Serialize<T>(T message) - { - AutoProtobuf.Build<T>(); - - using (MemoryStream ms = new MemoryStream()) - { - Serializer.Serialize<T>(ms, message); - return ms.ToArray(); - } - } - - public static T Deserialize<T>(byte[] array) - { - AutoProtobuf.Build<T>(); - - using (MemoryStream ms = new MemoryStream(array)) - { - return Serializer.Deserialize<T>(ms); - } - } - - public static ByteString SerializeToByteString<T>(T message) - { - AutoProtobuf.Build<T>(); - - return ByteString.CopyFrom(Serialize<T>(message)); - } - - public static T DeserializeFromByteString<T>(ByteString byteString) - { - 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 = ProtoSerializer.DeserializeFromByteString(genericType, (message as GenericRequest).Data); - return innerMessage as T; - } - } -} diff --git a/Software/Visual_Studio/Tango.Transport/Tango.Transport.csproj b/Software/Visual_Studio/Tango.Transport/Tango.Transport.csproj index 120584798..f83384097 100644 --- a/Software/Visual_Studio/Tango.Transport/Tango.Transport.csproj +++ b/Software/Visual_Studio/Tango.Transport/Tango.Transport.csproj @@ -125,7 +125,7 @@ <Compile Include="PendingResponse.cs" /> <Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="ITransporter.cs" /> - <Compile Include="ProtoSerializer.cs" /> + <Compile Include="GenericMessageSerializer.cs" /> <Compile Include="RequestFailedEventArgs.cs" /> <Compile Include="ResponseErrorException.cs" /> <Compile Include="Routing\SimpleTransportRouter.cs" /> @@ -186,7 +186,7 @@ <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <ProjectExtensions> <VisualStudio> - <UserProperties BuildVersion_StartDate="2000/1/1" BuildVersion_UseGlobalSettings="False" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" /> + <UserProperties BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UseGlobalSettings="False" BuildVersion_StartDate="2000/1/1" /> </VisualStudio> </ProjectExtensions> </Project>
\ No newline at end of file diff --git a/Software/Visual_Studio/Tango.Transport/TransporterBase.cs b/Software/Visual_Studio/Tango.Transport/TransporterBase.cs index 5e076738c..0958e4d9f 100644 --- a/Software/Visual_Studio/Tango.Transport/TransporterBase.cs +++ b/Software/Visual_Studio/Tango.Transport/TransporterBase.cs @@ -334,7 +334,7 @@ namespace Tango.Transport if (handlers.Count > 0) { - var innerRequest = ProtoSerializer.DeserializeFromByteString(handlers[0].RequestType, genericRequest.Data); + var innerRequest = GenericMessageSerializer.DeserializeFromByteString(handlers[0].RequestType, genericRequest.Data); foreach (var handler in handlers) { @@ -930,10 +930,10 @@ namespace Tango.Transport { GenericRequest genericRequest = new GenericRequest(); genericRequest.Type = request.GetType().AssemblyQualifiedName; - genericRequest.Data = ProtoSerializer.SerializeToByteString<Request>(request); + genericRequest.Data = GenericMessageSerializer.SerializeToByteString<Request>(request); var response = await SendRequest<GenericRequest, GenericResponse>(genericRequest, config); - var responseObject = ProtoSerializer.DeserializeFromByteString<Response>(response.Message.Data); + var responseObject = GenericMessageSerializer.DeserializeFromByteString<Response>(response.Message.Data); return responseObject; } @@ -949,7 +949,7 @@ namespace Tango.Transport { GenericResponse genericResponse = new GenericResponse(); - genericResponse.Data = ProtoSerializer.SerializeToByteString<Response>(response); + genericResponse.Data = GenericMessageSerializer.SerializeToByteString<Response>(response); await SendResponse<GenericResponse>(genericResponse, token, config); } @@ -966,7 +966,7 @@ namespace Tango.Transport GenericRequest genericRequest = new GenericRequest(); genericRequest.Type = request.GetType().AssemblyQualifiedName; - genericRequest.Data = ProtoSerializer.SerializeToByteString<Request>(request); + genericRequest.Data = GenericMessageSerializer.SerializeToByteString<Request>(request); Subject<Response> subject = new Subject<Response>(); @@ -975,7 +975,7 @@ namespace Tango.Transport try { - var responseObject = ProtoSerializer.DeserializeFromByteString<Response>(response.Message.Data); + var responseObject = GenericMessageSerializer.DeserializeFromByteString<Response>(response.Message.Data); subject.OnNext(responseObject); } catch (Exception ex) |
