gpt4 book ai didi

c# - 具有 "self-creating"属性的对象的自定义 JSON 序列化以无限循环结束

转载 作者:太空宇宙 更新时间:2023-11-03 16:18:32 24 4
gpt4 key购买 nike

在我正在处理的项目(在 C# 中)中,我必须使用 JSON 表示形式,该表示形式还包含序列化对象的方法。这就是我必须实现自己的序列化程序的原因。 Serializer 非常简单地通过反射实现。我的问题是它还必须能够处理具有与原始对象相同类型的“自创建”属性的对象。

例子:

class ClassA  
{
private ClassA a;
public ClassA A
{
get
{
if (a == null)
a = new ClassA();
return a;
}
}
}

每次我迭代 Properties 时都会创建新对象 (a),这样 Serializer 就会以无限递归结束。

知道如何避免这种情况吗?任何建议表示赞赏。

最佳答案

创建一个属性来标记您不想在序列化过程中触及的属性。仅序列化没有该属性的属性。

[AttributeUsage(AttributeTargets.Property)]
public class DoNotSerializeAttribute : Attribute
{
}

用法:

class ClassA
{
private ClassA a;

[DoNotSerialize]
public ClassA A
{
get
{
if (a == null)
a = new ClassA();
return a;
}
}
}

当您确定要序列化的属性时:

var properties = theType.GetProperties()
.Where(x => x.GetCustomAttributes(typeof (DoNotSerializeAttribute), true).Length == 0);

如果您不能修改该类,您可以传入要排除的显式属性列表,例如:

PropertyInfo[] exclude = new[]{ typeof(ClassA).GetProperty("A") };    
var properties = typeof(ClassA).GetProperties().Except(exclude);

关于c# - 具有 "self-creating"属性的对象的自定义 JSON 序列化以无限循环结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14864769/

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