如何使用递归遍历进行序列化?

时间:2014-07-21 12:38:34

标签: c# serialization recursion traversal tree-traversal

我的序列化程序序列化属性和字段 如果有自定义复杂类型,我的序列化器将无法工作 我想添加自定义复杂类型的序列化,并允许进行递归遍历。 我是编程的新手,坦率地说,我从来没有处理过递归遍历。

这就是我现在所拥有的:

internal class MySerializer
{
    private Type targetType;

    public MySerializer(Type targetType)
    {
        this.targetType = targetType;
        if (!targetType.IsDefined(typeof (DataContractAttribute), false))
            throw new Exception("No soup for you");
    }

    public void WriteObject(Stream stream, Object graph)
    {
        IEnumerable<MemberInfo> serializbleMembers =
            targetType.GetMembers(BindingFlags.GetField | BindingFlags.GetProperty | BindingFlags.Instance |
                                  BindingFlags.Public | BindingFlags.NonPublic)
                .Where(p => p.IsDefined(typeof (DataMemberAttribute), false));
        var writer = new StreamWriter(stream);
        writer.WriteLine("<" + targetType.Name + ">");
        foreach (MemberInfo memberInfo in serializbleMembers)
        {
            writer.Write("\t<" + memberInfo.Name + ">");
            var fieldInfo = memberInfo as FieldInfo;
            if (fieldInfo != null)
            {
                writer.Write(fieldInfo.GetValue(graph).ToString());
            }

            var propInfo = memberInfo as PropertyInfo;
            if (propInfo != null)
            {
                writer.Write(propInfo.GetValue(graph, null).ToString());
            }

            writer.Write("</" + memberInfo.Name + ">");
        }
        writer.WriteLine("</" + targetType.Name + ">");
        writer.Flush();
    }
}


[DataContract]
class Person 
{
    [DataMember]
    public string _family;
    [DataMember]
    public string FirstName { get; set; }
    [DataMember]
    public string LastName { get; set; }
    [DataMember]
    public int Age { get; set; }      
 }

1 个答案:

答案 0 :(得分:2)

我认为您正在寻找的是对象的post-order traversal,您可以在其中首先点击所有树叶,然后将序列化返回到父对象。如果你走这条路,虽然我建议使用迭代方法而不是递归方法,因为遍历一个非常复杂的对象可能会导致stack overflow

这种方法的问题在于它仅在被序列化的对象是树时才有效。很多时候它们都是,但许多对象层次结构实际上是有向图。你可以很容易地拥有两个相互指向的复杂对象,在这种情况下你只能无限遍历。