Blame view

Yi.Abp.Net8/framework/Yi.Framework.SqlSugarCore/SqlSugarNonPublicSerializer.cs 2.48 KB
515fceeb   “wangming”   框架初始化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
  using System.Reflection;
  using Newtonsoft.Json;
  using Newtonsoft.Json.Serialization;
  using SqlSugar;
  
  namespace Yi.Framework.SqlSugarCore;
  
  public class NonPublicPropertiesResolver : DefaultContractResolver
  {
      /// <summary>
      /// 重写获取属性,存在get set方法就可以写入
      /// </summary>
      /// <param name="member"></param>
      /// <param name="memberSerialization"></param>
      /// <returns></returns>
      protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
      {
          var prop = base.CreateProperty(member, memberSerialization);
          if (member is PropertyInfo pi)
          {
              prop.Readable = (pi.GetMethod != null);
              prop.Writable = (pi.SetMethod != null);
          }
  
          return prop;
      }
  }
  
  public class SqlSugarNonPublicSerializer : ISerializeService
  {
      /// <summary>
      /// 默认的序列化服务
      /// </summary>
      private readonly ISerializeService _serializeService = DefaultServices.Serialize;
  
      public string SerializeObject(object value)
      {
          //保留原有实现
          return  _serializeService.SerializeObject(value);
      }
  
      public string SugarSerializeObject(object value)
      { //保留原有实现
          return  _serializeService.SugarSerializeObject(value);
      }
      
      /// <summary>
      /// 重写对象反序列化支持NoPublic访问器
      /// </summary>
      /// <param name="value"></param>
      /// <typeparam name="T"></typeparam>
      /// <returns></returns>
      public T DeserializeObject<T>(string value)
      {
          if (typeof(T).FullName.StartsWith("System.Text.Json."))
          {
              // 动态创建一个 JsonSerializer 实例
              Type serializerType =typeof(T).Assembly.GetType("System.Text.Json.JsonSerializer");
  
              var methods = serializerType
                  .GetMethods().Where(it=>it.Name== "Deserialize")
                  .Where(it=>it.GetParameters().Any(z=>z.ParameterType==typeof(string))).First();
  
              // 调用 SerializeObject 方法序列化对象
              T json = (T)methods.MakeGenericMethod(typeof(T))
                  .Invoke(null, new object[] { value, null! });
              return json!;
          }
          var jSetting = new JsonSerializerSettings 
          {
              NullValueHandling = NullValueHandling.Ignore,
              ContractResolver =new NonPublicPropertiesResolver() //替换默认解析器使能支持protect
          };
          return JsonConvert.DeserializeObject<T>(value, jSetting)!;
      }
  }