gpt4 book ai didi

c# - json.net:首先序列化基类成员

转载 作者:太空狗 更新时间:2023-10-29 17:56:15 31 4
gpt4 key购买 nike

我正在使用 json.net 存储序列化对象,我希望人们能够在文本编辑器中对其进行编辑。我有一个包含对象名称的基类,然后是一个继承自该对象并添加一些其他属性的类。

问题是属性的写法是先写派生类的属性,然后再写基类的属性,所以我得到:

{
"MySpecialFiled": 4,
"Name": "This Is My Object",
"AnotherBaseField": 8,
}

而不是:

{
"Name": "This Is My Object",
"AnotherBaseField": 8,
"MySpecialFiled": 4,
}

当您在派生类中有一堆字段并且想要在文本编辑器中实际查看/编辑时,您会发现这有点痛苦!

我特别弄乱了源代码:

public static IEnumerable<FieldInfo> GetFields(Type targetType, BindingFlags bindingAttr)

public static IEnumerable<PropertyInfo> GetProperties(Type targetType, BindingFlags bindingAttr)

在 ReflectionUtils.cs 中,尝试颠倒顺序以便基类属性排在第一位,但我还没有取得任何成功。我是否遗漏了一些微不足道的东西?

最佳答案

我认为您无需更改 JSON.Net 的代码即可执行此操作。显然,您可以使用自定义契约(Contract)解析器来完成 - 通过继承 DefaultContractResolver - 如 this code pasted by someone with a similar issue 所示 在 json.net 论坛上。该海报覆盖 CreateProperties 并根据定义类型的继承深度对属性进行排序。

以下代码基于该帖子中的代码(来自 CodePlex 上的 LittleColin)。这编译但未测试:

public class CustomPropertySortContractResolver : DefaultContractResolver
{
private const int MaxPropertiesPerContract = 1000;

protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
{
var members = GetSerializableMembers(type);
if (members == null)
{
throw new JsonSerializationException("Null collection of serializable members returned.");
}

return members.Select(member => CreateProperty(member, memberSerialization))
.Where(x => x != null)
.OrderBy(p => (p.Order
+ (MaxPropertiesPerContract * GetTypeDepth(p.DeclaringType)))
?? -1)
.ToList();
}

private static int GetTypeDepth(Type type)
{
int depth = 0;
while ((type = type.BaseType) != null)
{
depth++;
}

return depth;
}
}

另见 this project对于过滤要序列化的属性的类似代码。

关于c# - json.net:首先序列化基类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19909168/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com