diff --git a/Nats.Services.Core/NatsServiceSerializer.cs b/Nats.Services.Core/NatsServiceSerializer.cs index 05f4494..cf18265 100644 --- a/Nats.Services.Core/NatsServiceSerializer.cs +++ b/Nats.Services.Core/NatsServiceSerializer.cs @@ -5,90 +5,90 @@ namespace Nats.Services.Core { - public class NatsServiceSerializer - { - DataContractJsonSerializer serializer; - Dictionary returnTypeSerializers = new Dictionary(); + public class NatsServiceSerializer + { + DataContractJsonSerializer serializer; + Dictionary returnTypeSerializers = new Dictionary(); - public NatsServiceSerializer() - { - HashSet types = new HashSet(); - foreach (var methInfo in typeof(T).GetAllMethodInfos()) - { - foreach (var paramInfo in methInfo.GetParameters()) - { - types.Add(paramInfo.ParameterType); - } - if (methInfo.ReturnType != typeof(void)) - { - returnTypeSerializers.Add(methInfo.ReturnType, new DataContractJsonSerializer(methInfo.ReturnType)); - } - } + public NatsServiceSerializer() + { + HashSet types = new HashSet(); + foreach (var methInfo in typeof(T).GetAllMethodInfos()) + { + foreach (var paramInfo in methInfo.GetParameters()) + { + types.Add(paramInfo.ParameterType); + } + if (methInfo.ReturnType != typeof(void) && ! returnTypeSerializers.ContainsKey(methInfo.ReturnType)) + { + returnTypeSerializers.Add(methInfo.ReturnType, new DataContractJsonSerializer(methInfo.ReturnType)); + } + } - foreach (var evtInfo in typeof(T).GetAllEventInfos()) - { - var methInfo = evtInfo.EventHandlerType.GetMethod(nameof(EventHandler.Invoke)); - foreach (var paramInfo in methInfo.GetParameters()) - { - types.Add(paramInfo.ParameterType); - } - } + foreach (var evtInfo in typeof(T).GetAllEventInfos()) + { + var methInfo = evtInfo.EventHandlerType.GetMethod(nameof(EventHandler.Invoke)); + foreach (var paramInfo in methInfo.GetParameters()) + { + types.Add(paramInfo.ParameterType); + } + } - serializer = new DataContractJsonSerializer(typeof(List>), types); - } + serializer = new DataContractJsonSerializer(typeof(List>), types); + } - public List> DeserializeMethodArguments(byte[] buffer) - { - return DeserializeObject(serializer, buffer) as List>; - } - public byte[] SerializeMethodArguments(object obj) - { - return SerializeObject(serializer, obj); - } + public List> DeserializeMethodArguments(byte[] buffer) + { + return DeserializeObject(serializer, buffer) as List>; + } + public byte[] SerializeMethodArguments(object obj) + { + return SerializeObject(serializer, obj); + } - public object DeserializeReturnObject(Type type, byte[] buffer) - { - DataContractJsonSerializer returnTypeSerializer = returnTypeSerializers[type]; - return DeserializeObject(returnTypeSerializer, buffer); - } - public byte[] SerializeReturnObject(object obj) - { - DataContractJsonSerializer returnTypeSerializer = returnTypeSerializers[obj.GetType()]; - return SerializeObject(returnTypeSerializer, obj); - } + public object DeserializeReturnObject(Type type, byte[] buffer) + { + DataContractJsonSerializer returnTypeSerializer = returnTypeSerializers[type]; + return DeserializeObject(returnTypeSerializer, buffer); + } + public byte[] SerializeReturnObject(object obj) + { + DataContractJsonSerializer returnTypeSerializer = returnTypeSerializers[obj.GetType()]; + return SerializeObject(returnTypeSerializer, obj); + } - public static object DeserializeObject(DataContractJsonSerializer serializer, byte[] buffer) - { - using (var stream = new MemoryStream(buffer)) - { - var obj = serializer.ReadObject(stream); - return obj; - } - } + public static object DeserializeObject(DataContractJsonSerializer serializer, byte[] buffer) + { + using (var stream = new MemoryStream(buffer)) + { + var obj = serializer.ReadObject(stream); + return obj; + } + } - public static byte[] SerializeObject(DataContractJsonSerializer serializer, object obj) - { - if (obj == null) - { - return null; - } + public static byte[] SerializeObject(DataContractJsonSerializer serializer, object obj) + { + if (obj == null) + { + return null; + } - using (var stream = new MemoryStream()) - { - serializer.WriteObject(stream, obj); - var buffer = stream.ToArray(); - return buffer; - } - } + using (var stream = new MemoryStream()) + { + serializer.WriteObject(stream, obj); + var buffer = stream.ToArray(); + return buffer; + } + } - public string ToString(byte[] buffer) - { - using (var stream = new MemoryStream(buffer)) - { - stream.Position = 0; - var streamReader = new StreamReader(stream); - return streamReader.ReadToEnd(); - } - } - } + public string ToString(byte[] buffer) + { + using (var stream = new MemoryStream(buffer)) + { + stream.Position = 0; + var streamReader = new StreamReader(stream); + return streamReader.ReadToEnd(); + } + } + } } diff --git a/Nats.Services.Tests/NatsServiceSerializerTests.cs b/Nats.Services.Tests/NatsServiceSerializerTests.cs index 89c7eb2..9f6ac89 100644 --- a/Nats.Services.Tests/NatsServiceSerializerTests.cs +++ b/Nats.Services.Tests/NatsServiceSerializerTests.cs @@ -6,121 +6,122 @@ namespace Nats.Services.Tests { - public class NatsServiceSerializerTests - { - NatsServiceSerializer serializer; - List> args; - AnotherDummyClass anotherArg; - - public interface IDummyService - { - void Log(List obj); - AnotherDummyClass Create(double x, int n); - } - - public NatsServiceSerializerTests() - { - serializer = new NatsServiceSerializer(); - args = new List> - { - new KeyValuePair("dummy1", new DummyClass { Name = "aaaaa", Id = 11 }), - new KeyValuePair("dummy2", new DummyClass { Name = "bbbbb", Id = 22 }) - }; - - anotherArg = new AnotherDummyClass { X = 1.25, N = 11 }; - } - - - [Fact] - public void SerializeMethodArgumentsTest() - { - byte[] payload = serializer.SerializeMethodArguments(args); - string json = serializer.ToString(payload); - string jsonExpected = "[{\"key\":\"dummy1\",\"value\":{\"__type\":\"NatsServiceSerializerTests.DummyClass:#Nats.Services.Tests\",\"Id\":11,\"Name\":\"aaaaa\"}},{\"key\":\"dummy2\",\"value\":{\"__type\":\"NatsServiceSerializerTests.DummyClass:#Nats.Services.Tests\",\"Id\":22,\"Name\":\"bbbbb\"}}]"; - Check.That(json).IsEqualTo(jsonExpected); - - var deserializedArgs = serializer.DeserializeMethodArguments(payload); - Check.That(deserializedArgs.Count).IsEqualTo(2); - Check.That(deserializedArgs.Count).IsEqualTo(args.Count); - Check.That(deserializedArgs[0]).IsEqualTo(args[0]); - Check.That(deserializedArgs[1]).IsEqualTo(args[1]); - } - - [Fact] - public void SerializeMethodArgumentsExceptionTest() - { - var serializer = new NatsServiceSerializer(); - - var args = new List> - { - new KeyValuePair("dummy1", anotherArg) - }; - - Check.ThatCode(() => serializer.SerializeMethodArguments(args)).Throws(); ; - } - - [Fact] - public void SerializeReturnObjectTest() - { - byte[] payload = serializer.SerializeReturnObject(anotherArg); - string json = serializer.ToString(payload); - string jsonExpected = "{\"N\":11,\"X\":1.25}"; - Check.That(json).IsEqualTo(jsonExpected); - - var deserializedObj = serializer.DeserializeReturnObject(anotherArg.GetType(), payload); - Check.That(deserializedObj).IsEqualTo(anotherArg); - } - - [Fact] - public void SerializeReturnObjectExceptionTest() - { - Check.ThatCode(() => serializer.SerializeReturnObject(args)).Throws(); ; - } - - [DataContract] - public class DummyClass - { - [DataMember] - public string Name { get; set; } - [DataMember] - public int Id { get; set; } - - public override bool Equals(object obj) - { - var c = obj as DummyClass; - return c != null && Name == c.Name && Id == c.Id; - } - - public override int GetHashCode() - { - var hashCode = 1460282102; - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(Name); - hashCode = hashCode * -1521134295 + Id.GetHashCode(); - return hashCode; - } - } - - [DataContract] - public class AnotherDummyClass - { - [DataMember] - public double X { get; set; } - [DataMember] - public int N { get; set; } - - public override bool Equals(object obj) - { - var c = obj as AnotherDummyClass; - return c != null && X == c.X && N == c.N; - } - - public override int GetHashCode() - { - var hashCode = 1576192272; - hashCode = hashCode * -1521134295 + X.GetHashCode(); - hashCode = hashCode * -1521134295 + N.GetHashCode(); - return hashCode; - } - } - } + public class NatsServiceSerializerTests + { + NatsServiceSerializer serializer; + List> args; + AnotherDummyClass anotherArg; + + public interface IDummyService + { + void Log(List obj); + AnotherDummyClass Create(double x, int n); + AnotherDummyClass Get(int n); + } + + public NatsServiceSerializerTests() + { + serializer = new NatsServiceSerializer(); + args = new List> + { + new KeyValuePair("dummy1", new DummyClass { Name = "aaaaa", Id = 11 }), + new KeyValuePair("dummy2", new DummyClass { Name = "bbbbb", Id = 22 }) + }; + + anotherArg = new AnotherDummyClass { X = 1.25, N = 11 }; + } + + + [Fact] + public void SerializeMethodArgumentsTest() + { + byte[] payload = serializer.SerializeMethodArguments(args); + string json = serializer.ToString(payload); + string jsonExpected = "[{\"key\":\"dummy1\",\"value\":{\"__type\":\"NatsServiceSerializerTests.DummyClass:#Nats.Services.Tests\",\"Id\":11,\"Name\":\"aaaaa\"}},{\"key\":\"dummy2\",\"value\":{\"__type\":\"NatsServiceSerializerTests.DummyClass:#Nats.Services.Tests\",\"Id\":22,\"Name\":\"bbbbb\"}}]"; + Check.That(json).IsEqualTo(jsonExpected); + + var deserializedArgs = serializer.DeserializeMethodArguments(payload); + Check.That(deserializedArgs.Count).IsEqualTo(2); + Check.That(deserializedArgs.Count).IsEqualTo(args.Count); + Check.That(deserializedArgs[0]).IsEqualTo(args[0]); + Check.That(deserializedArgs[1]).IsEqualTo(args[1]); + } + + [Fact] + public void SerializeMethodArgumentsExceptionTest() + { + var serializer = new NatsServiceSerializer(); + + var args = new List> + { + new KeyValuePair("dummy1", anotherArg) + }; + + Check.ThatCode(() => serializer.SerializeMethodArguments(args)).Throws(); ; + } + + [Fact] + public void SerializeReturnObjectTest() + { + byte[] payload = serializer.SerializeReturnObject(anotherArg); + string json = serializer.ToString(payload); + string jsonExpected = "{\"N\":11,\"X\":1.25}"; + Check.That(json).IsEqualTo(jsonExpected); + + var deserializedObj = serializer.DeserializeReturnObject(anotherArg.GetType(), payload); + Check.That(deserializedObj).IsEqualTo(anotherArg); + } + + [Fact] + public void SerializeReturnObjectExceptionTest() + { + Check.ThatCode(() => serializer.SerializeReturnObject(args)).Throws(); ; + } + + [DataContract] + public class DummyClass + { + [DataMember] + public string Name { get; set; } + [DataMember] + public int Id { get; set; } + + public override bool Equals(object obj) + { + var c = obj as DummyClass; + return c != null && Name == c.Name && Id == c.Id; + } + + public override int GetHashCode() + { + var hashCode = 1460282102; + hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(Name); + hashCode = hashCode * -1521134295 + Id.GetHashCode(); + return hashCode; + } + } + + [DataContract] + public class AnotherDummyClass + { + [DataMember] + public double X { get; set; } + [DataMember] + public int N { get; set; } + + public override bool Equals(object obj) + { + var c = obj as AnotherDummyClass; + return c != null && X == c.X && N == c.N; + } + + public override int GetHashCode() + { + var hashCode = 1576192272; + hashCode = hashCode * -1521134295 + X.GetHashCode(); + hashCode = hashCode * -1521134295 + N.GetHashCode(); + return hashCode; + } + } + } }