Prechádzať zdrojové kódy

只允许反序列化的契约解释器

懒得勤快 3 rokov pred
rodič
commit
49cbde2762

+ 35 - 0
Masuit.Tools.Abstractions/Systems/DeserializeOnlyContractResolver.cs

@@ -0,0 +1,35 @@
+using Newtonsoft.Json.Serialization;
+using Newtonsoft.Json;
+using System.Reflection;
+using System;
+
+namespace Masuit.Tools.Systems;
+
+/// <summary>
+/// 只允许反序列化
+/// </summary>
+[AttributeUsage(AttributeTargets.Property)]
+public class DeserializeOnlyJsonPropertyAttribute : Attribute
+{
+}
+
+/// <summary>
+/// 只允许反序列化的契约解释器
+/// </summary>
+public class DeserializeOnlyContractResolver : DefaultContractResolver
+{
+    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
+    {
+        var property = base.CreateProperty(member, memberSerialization);
+        if (property is { Writable: true })
+        {
+            var attributes = property.AttributeProvider.GetAttributes(typeof(DeserializeOnlyJsonPropertyAttribute), true);
+            if (attributes is { Count: > 0 })
+            {
+                property.ShouldSerialize = _ => false;
+            }
+        }
+
+        return property;
+    }
+}

+ 4 - 0
NetCoreTest/Program.cs

@@ -14,6 +14,7 @@ using System.Collections.Generic;
 using System.ComponentModel;
 using System.IO;
 using System.Linq;
+using Masuit.Tools.Systems;
 using LicenseContext = OfficeOpenXml.LicenseContext;
 
 namespace NetCoreTest
@@ -86,6 +87,7 @@ namespace NetCoreTest
             var dec = enc.RSADecrypt();
             Console.WriteLine(dec);
             Console.ReadKey();
+
             //CreateWebHostBuilder(args).Build().Run();
         }
 
@@ -98,6 +100,7 @@ namespace NetCoreTest
     {
         [Description("test")]
         public string Pid { get; set; }
+
         public int? MyProperty1 { get; set; }
 
         /// <summary>
@@ -120,6 +123,7 @@ namespace NetCoreTest
         /// <summary>
         /// 名字
         /// </summary>
+        [DeserializeOnlyJsonProperty]
         public string Name { get; set; }
     }
 }