2

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

例子:

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

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

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

4

1 回答 1

0

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

[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);
于 2013-02-14T13:38:48.850 回答