替换Sqlsugar默认序列化器,解决.Select()映射嵌套/匿名类时,实体的非公有访问器 值无法绑定,如Id(protect属性)

This commit is contained in:
bi8bo
2024-08-30 14:41:45 +08:00
parent bfe0f346c8
commit e3aada0fff
3 changed files with 83 additions and 2 deletions

View File

@@ -0,0 +1,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);
}
}