C# 递归实现IFormatter

C# 递归实现IFormatter,c#,serialization,C#,Serialization,我正在尝试使用.NET IFormatter接口实现自定义格式化程序 经过几个小时的搜索,我发现了一个非常基本的示例,不幸的是它不包含递归。我还尝试使用Reflector查看BinaryFormatter和SoapFormatter,但它们相当复杂 我的问题是: 我应该自己实现递归,还是在FormatterServices中遗漏了一些东西 我的代码如下: public void Serialize(Stream serializationStream, object graph) { /

我正在尝试使用.NET IFormatter接口实现自定义格式化程序

经过几个小时的搜索,我发现了一个非常基本的示例,不幸的是它不包含递归。我还尝试使用Reflector查看BinaryFormatter和SoapFormatter,但它们相当复杂

我的问题是: 我应该自己实现递归,还是在FormatterServices中遗漏了一些东西

我的代码如下:

public void Serialize(Stream serializationStream, object graph)
{
    // Get fields that are to be serialized.
    MemberInfo[] members = FormatterServices.GetSerializableMembers(graph.GetType(), Context);

    // Get fields data.
    object[] data = FormatterServices.GetObjectData(graph, members);

    // Write class name and all fields & values to file
    StreamWriter sw = new StreamWriter(serializationStream);

    string accumulator = string.Empty;
    for (int i = 0; i < data.Length; ++i)
    {
        // Skip this field if it is marked NonSerialized.
        if (Attribute.IsDefined(members[i], typeof(NonSerializedAttribute)))
            continue;

        FieldInfo field = (FieldInfo)members[i];
        if (field.FieldType.IsPrimitive)
        {
        }
        else //TODO: What should I do here?
    }
    sw.Close();
}
public void序列化(流序列化流,对象图)
{
//获取要序列化的字段。
MemberInfo[]members=FormatterServices.GetSerializableMembers(graph.GetType(),Context);
//获取字段数据。
object[]data=FormatterServices.GetObjectData(图形,成员);
//将类名和所有字段及值写入文件
StreamWriter sw=新StreamWriter(序列化流);
字符串累加器=string.Empty;
对于(int i=0;i
如果递归的意思是遍历对象树,那么是的,这取决于您实现自己的IFormatter

只需检查属性的值是否不为null,以及它是否正在实现IFormatter接口。如果是,则调用它并使用它返回的值。 如果不是这样,那又取决于您:您可能会抛出一个异常,说明必须实现IFormatter,或者只是退回到某种默认格式化程序(XML或二进制格式)

递归本身很棘手。比方说,当对象引用自身时,您需要足够聪明来处理这种情况,而不是以无限循环结束:

public class A {
    public object SomeProperty { get; set; }
}
var a = new A();
a.SomeProperty = a;
在实现格式化程序时有许多棘手的方面,比如如果两个属性实际上引用了同一个对象怎么办?您会将其序列化/格式化两次还是仅一次,并以某种方式保留有关这些引用的信息?
如果只需要单向序列化,则可能不需要此功能,但如果希望能够还原对象,则此功能可能很重要……

如果递归是指遍历对象树,则是的,在实现自己的IFormatter时,这取决于您自己

只需检查属性的值是否不为null,以及它是否正在实现IFormatter接口。如果是,则调用它并使用它返回的值。 如果不是这样,那又取决于您:您可能会抛出一个异常,说明必须实现IFormatter,或者只是退回到某种默认格式化程序(XML或二进制格式)

递归本身很棘手。比方说,当对象引用自身时,您需要足够聪明来处理这种情况,而不是以无限循环结束:

public class A {
    public object SomeProperty { get; set; }
}
var a = new A();
a.SomeProperty = a;
在实现格式化程序时有许多棘手的方面,比如如果两个属性实际上引用了同一个对象怎么办?您会将其序列化/格式化两次还是仅一次,并以某种方式保留有关这些引用的信息? 如果只希望单向序列化,则可能不需要此功能,但如果希望能够还原对象,则此功能可能很重要