Преглед на файлове

fix serialize enum issue
> will serialize to string not int

Lith преди 1 година
родител
ревизия
d95f01e116

+ 4 - 3
dotnet/Library/Sers/Sers.Core/Sers.Core/Module/Serialization/Text/Serialization_Text.cs

@@ -1,15 +1,13 @@
 using System;
 using System.Runtime.CompilerServices;
 using System.Text.Json;
+using System.Text.Json.Serialization;
 using System.Text.Unicode;
 
-using Newtonsoft.Json.Linq;
-
 using Vit.Core.Module.Serialization;
 using Vit.Core.Util.ConfigurationManager;
 using Vit.Extensions;
 using Vit.Extensions.Json_Extensions;
-using Vit.Extensions.Object_Serialize_Extensions;
 
 namespace Sers.Core.Module.Serialization.Text
 {
@@ -41,6 +39,9 @@ namespace Sers.Core.Module.Serialization.Text
         {
             options.AddConverter_Newtonsoft();
 
+            // serialize enum to string not int
+            options.Converters.Add(new JsonStringEnumConverter());
+
             // format DateTime
             var DateTimeFormat = Appsettings.json.GetByPath<string>("Vit.Serialization.DateTimeFormat") ?? "yyyy-MM-dd HH:mm:ss";
 

+ 84 - 22
dotnet/Library/Sers/Sers.Core/Test/Sers.Core.MsTest/Module/Serialization_Text_Test.cs

@@ -9,31 +9,29 @@ namespace Sers.Core.MsTest.Module
     [TestClass]
     public class Serialization_Text_Test
     {
-        class ModelA
+        class Person
         {
             public int? id;
             public string name;
-            public DateTime time;
+            public DateTime birth;
+            public ESex sex;
         }
+
+        enum ESex
+        {
+            unknow,
+            man,
+            woman
+        }
+
+
         static readonly string testString = "testString中文12—=¥$《》<> \n\r\t😀" + DateTime.Now;
         static Serialization_Text Instance => Serialization_Text.Instance;
 
         [TestMethod]
         public void TestMethod_String()
         {
-
-
-            // #1 object
-            {
-                var modelA = new ModelA { id = 1, name = testString };
-                var objA = new { id = 1, name = testString };
-
-
-                Assert.AreEqual(testString, Instance.Deserialize<ModelA>(Instance.Serialize(modelA))?.name);
-                Assert.AreEqual(testString, Instance.Deserialize<ModelA>(Instance.Serialize(objA))?.name);
-            }
-
-            // #2 ValueType
+            // #1 ValueType
             {
                 // string
                 TestBySerialize(testString);
@@ -64,6 +62,46 @@ namespace Sers.Core.MsTest.Module
                 TestBySerialize(date, "\"2019-01-01 01:01:01\"");
                 TestBySerialize((DateTime?)date);
                 TestBySerialize((DateTime?)null);
+
+            }
+
+            // #2 enum
+            {
+                TestBySerialize(ESex.man);
+                TestBySerialize((ESex?)ESex.man);
+                TestBySerialize((ESex?)null);
+
+                var sex = Instance.Deserialize<ESex>("\"man\"");
+                Assert.AreEqual(ESex.man, sex);
+            }
+
+            // #3 Model
+            {
+                var date = DateTime.Parse("2019-01-01 01:01:01");
+                var expected = new Person { id = 1, name = testString, sex = ESex.man, birth = date };
+
+                var str = Instance.Serialize(expected);
+                var actual = Instance.Deserialize<Person>(str);
+
+
+                Assert.AreEqual(expected.id, actual.id);
+                Assert.AreEqual(expected.name, actual.name);
+                Assert.AreEqual(expected.sex, actual.sex);
+                Assert.AreEqual(expected.birth, actual.birth);
+            }
+
+            // #4 object
+            {
+                var date = DateTime.Parse("2019-01-01 01:01:01");
+                var expected = new { id = 1, name = testString, sex = ESex.man, birth = date };
+
+                var str = Instance.Serialize(expected);
+                var actual = Instance.Deserialize<Person>(str);
+
+                Assert.AreEqual(expected.id, actual.id);
+                Assert.AreEqual(expected.name, actual.name);
+                Assert.AreEqual(expected.sex, actual.sex);
+                Assert.AreEqual(expected.birth, actual.birth);
             }
         }
 
@@ -87,7 +125,7 @@ namespace Sers.Core.MsTest.Module
         public void TestMethod_DateTimeFormat()
         {
             var date = DateTime.Parse("2019-01-01 01:01:01");
-            var objA = new { time = date };
+            var objA = new { birth = date };
 
 
             var dateFormatString = Instance.jsonConverter_DateTime.dateFormatString;
@@ -97,9 +135,9 @@ namespace Sers.Core.MsTest.Module
                 Instance.jsonConverter_DateTime.dateFormatString = format;
 
                 string str = Instance.Serialize(objA);
-                var obj2 = Instance.Deserialize<ModelA>(str);
+                var obj2 = Instance.Deserialize<Person>(str);
 
-                Assert.AreEqual(DateTime.Parse("2019-01-01"), obj2.time);
+                Assert.AreEqual(DateTime.Parse("2019-01-01"), obj2.birth);
             }
             finally
             {
@@ -113,11 +151,35 @@ namespace Sers.Core.MsTest.Module
         [TestMethod]
         public void TestMethod_Bytes()
         {
-            var modelA = new ModelA { id = 1, name = testString, time = DateTime.Now };
-            var objA = new { id = 1, name = testString, time = DateTime.Now };
+            // #1 Model
+            {
+                var date = DateTime.Parse("2019-01-01 01:01:01");
+                var expected = new Person { id = 1, name = testString, sex = ESex.man, birth = date };
 
-            Assert.AreEqual(Instance.DeserializeFromBytes<ModelA>(Instance.SerializeToBytes(modelA))?.name, testString);
-            Assert.AreEqual(Instance.DeserializeFromBytes<ModelA>(Instance.SerializeToBytes(objA))?.name, testString);
+                var bytes = Instance.SerializeToBytes(expected);
+                var actual = Instance.DeserializeFromBytes<Person>(bytes);
+
+
+                Assert.AreEqual(expected.id, actual.id);
+                Assert.AreEqual(expected.name, actual.name);
+                Assert.AreEqual(expected.sex, actual.sex);
+                Assert.AreEqual(expected.birth, actual.birth);
+            }
+
+            // #2 object
+            {
+                var date = DateTime.Parse("2019-01-01 01:01:01");
+                var expected = new { id = 1, name = testString, sex = ESex.man, birth = date };
+
+                var bytes = Instance.SerializeToBytes(expected);
+                var actual = Instance.DeserializeFromBytes<Person>(bytes);
+
+
+                Assert.AreEqual(expected.id, actual.id);
+                Assert.AreEqual(expected.name, actual.name);
+                Assert.AreEqual(expected.sex, actual.sex);
+                Assert.AreEqual(expected.birth, actual.birth);
+            }
         }
 
 

+ 84 - 21
dotnet/Library/Vit/Vit.Core/Test/Vit.Core.MsTest/Module/Serialization_Newtonsoft_Test.cs

@@ -9,12 +9,21 @@ namespace Vit.Core.MsTest.Module
     [TestClass]
     public class Serialization_Newtonsoft_Test
     {
-        class ModelA
+        class Person
         {
             public int? id;
             public string name;
-            public DateTime time;
+            public DateTime birth;
+            public ESex sex;
         }
+
+        enum ESex
+        {
+            unknow,
+            man,
+            woman
+        }
+
         static readonly string testString = "testString中文12—=¥$《》<> \n\r\t😀" + DateTime.Now;
         static Serialization_Newtonsoft Instance => Serialization_Newtonsoft.Instance;
 
@@ -22,18 +31,7 @@ namespace Vit.Core.MsTest.Module
         public void TestMethod_String()
         {
 
-
-            // #1 object
-            {
-                var modelA = new ModelA { id = 1, name = testString };
-                var objA = new { id = 1, name = testString };
-
-
-                Assert.AreEqual(testString, Instance.Deserialize<ModelA>(Instance.Serialize(modelA))?.name);
-                Assert.AreEqual(testString, Instance.Deserialize<ModelA>(Instance.Serialize(objA))?.name);
-            }
-
-            // #2 ValueType
+            // #1 ValueType
             {
                 // string
                 TestBySerialize(testString);
@@ -64,7 +62,48 @@ namespace Vit.Core.MsTest.Module
                 TestBySerialize(date, "\"2019-01-01 01:01:01\"");
                 TestBySerialize((DateTime?)date);
                 TestBySerialize((DateTime?)null);
+
             }
+
+            // #2 enum
+            {
+                TestBySerialize(ESex.man);
+                TestBySerialize((ESex?)ESex.man);
+                TestBySerialize((ESex?)null);
+
+                var sex = Instance.Deserialize<ESex>("\"man\"");
+                Assert.AreEqual(ESex.man, sex);
+            }
+
+            // #3 ModelA
+            {
+                var date = DateTime.Parse("2019-01-01 01:01:01");
+                var expected = new Person { id = 1, name = testString, sex = ESex.man, birth = date };
+
+                var str = Instance.Serialize(expected);
+                var actual = Instance.Deserialize<Person>(str);
+
+
+                Assert.AreEqual(expected.id, actual.id);
+                Assert.AreEqual(expected.name, actual.name);
+                Assert.AreEqual(expected.sex, actual.sex);
+                Assert.AreEqual(expected.birth, actual.birth);
+            }
+
+            // #4 object
+            {
+                var date = DateTime.Parse("2019-01-01 01:01:01");
+                var expected = new { id = 1, name = testString, sex = ESex.man, birth = date };
+
+                var str = Instance.Serialize(expected);
+                var actual = Instance.Deserialize<Person>(str);
+
+                Assert.AreEqual(expected.id, actual.id);
+                Assert.AreEqual(expected.name, actual.name);
+                Assert.AreEqual(expected.sex, actual.sex);
+                Assert.AreEqual(expected.birth, actual.birth);
+            }
+
         }
 
         public void TestBySerialize<T>(T value)
@@ -87,7 +126,7 @@ namespace Vit.Core.MsTest.Module
         public void TestMethod_DateTimeFormat()
         {
             var date = DateTime.Parse("2019-01-01 01:01:01");
-            var objA = new { time = date };
+            var objA = new { birth = date };
 
 
             var dateFormatString = Instance.serializeSetting.DateFormatString;
@@ -97,9 +136,9 @@ namespace Vit.Core.MsTest.Module
                 Instance.serializeSetting.DateFormatString = format;
 
                 string str = Instance.Serialize(objA);
-                var obj2 = Instance.Deserialize<ModelA>(str);
+                var obj2 = Instance.Deserialize<Person>(str);
 
-                Assert.AreEqual(DateTime.Parse("2019-01-01"), obj2.time);
+                Assert.AreEqual(DateTime.Parse("2019-01-01"), obj2.birth);
             }
             finally
             {
@@ -113,11 +152,35 @@ namespace Vit.Core.MsTest.Module
         [TestMethod]
         public void TestMethod_Bytes()
         {
-            var modelA = new ModelA { id = 1, name = testString, time = DateTime.Now };
-            var objA = new { id = 1, name = testString, time = DateTime.Now };
+            // #1 Model
+            {
+                var date = DateTime.Parse("2019-01-01 01:01:01");
+                var expected = new Person { id = 1, name = testString, sex = ESex.man, birth = date };
 
-            Assert.AreEqual(Instance.DeserializeFromBytes<ModelA>(Instance.SerializeToBytes(modelA))?.name, testString);
-            Assert.AreEqual(Instance.DeserializeFromBytes<ModelA>(Instance.SerializeToBytes(objA))?.name, testString);
+                var bytes = Instance.SerializeToBytes(expected);
+                var actual = Instance.DeserializeFromBytes<Person>(bytes);
+
+
+                Assert.AreEqual(expected.id, actual.id);
+                Assert.AreEqual(expected.name, actual.name);
+                Assert.AreEqual(expected.sex, actual.sex);
+                Assert.AreEqual(expected.birth, actual.birth);
+            }
+
+            // #2 object
+            {
+                var date = DateTime.Parse("2019-01-01 01:01:01");
+                var expected = new { id = 1, name = testString, sex = ESex.man, birth = date };
+
+                var bytes = Instance.SerializeToBytes(expected);
+                var actual = Instance.DeserializeFromBytes<Person>(bytes);
+
+
+                Assert.AreEqual(expected.id, actual.id);
+                Assert.AreEqual(expected.name, actual.name);
+                Assert.AreEqual(expected.sex, actual.sex);
+                Assert.AreEqual(expected.birth, actual.birth);
+            }
         }
 
 

+ 5 - 17
dotnet/Library/Vit/Vit.Core/Vit.Core/Module/Serialization/Serialization_Newtonsoft.cs

@@ -3,9 +3,8 @@ using System;
 using Vit.Core.Util.ConfigurationManager;
 using System.Runtime.CompilerServices;
 using System.Text;
-using Newtonsoft.Json.Linq;
 using Vit.Extensions.Json_Extensions;
-using Vit.Extensions.Newtonsoft_Extensions;
+using Newtonsoft.Json.Converters;
 
 namespace Vit.Core.Module.Serialization
 {
@@ -23,7 +22,6 @@ namespace Vit.Core.Module.Serialization
 
 
 
-        #region Basic Fields
 
 
         #region Member
@@ -65,7 +63,7 @@ namespace Vit.Core.Module.Serialization
         {
             return (encoding ?? this.encoding).GetBytes(data);
         }
-        #endregion
+        #endregion 
 
 
 
@@ -92,17 +90,10 @@ namespace Vit.Core.Module.Serialization
             return type.DefaultValue();
         }
 
-
-        #endregion
-
         #endregion
 
 
 
-
-
-
-
         public readonly Newtonsoft.Json.JsonSerializerSettings serializeSetting = new Newtonsoft.Json.JsonSerializerSettings();
 
         public Serialization_Newtonsoft()
@@ -113,9 +104,11 @@ namespace Vit.Core.Module.Serialization
             // no pretty style
             serializeSetting.Formatting = Formatting.None;
 
+            // serialize enum to string not int
+            serializeSetting.Converters.Add(new StringEnumConverter());
+
             // DateTimeFormat
             var DateTimeFormat = Appsettings.json.GetByPath<string>("Vit.Serialization.DateTimeFormat") ?? "yyyy-MM-dd HH:mm:ss";
-
             serializeSetting.DateFormatHandling = global::Newtonsoft.Json.DateFormatHandling.IsoDateFormat;
             serializeSetting.DateFormatString = DateTimeFormat;
         }
@@ -223,8 +216,6 @@ namespace Vit.Core.Module.Serialization
 
 
 
-
-
         #region #2 object <--> bytes
 
         #region SerializeToBytes
@@ -347,9 +338,6 @@ namespace Vit.Core.Module.Serialization
 
 
 
-
-
-
         #region #3 object <--> ArraySegmentByte
 
         #region SerializeToArraySegmentByte