我的序列化程序序列化属性和字段 如果有自定义复杂类型,我的序列化器将无法工作 我想添加自定义复杂类型的序列化,并允许进行递归遍历。 我是编程的新手,坦率地说,我从来没有处理过递归遍历。
这就是我现在所拥有的:
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; }
}
答案 0 :(得分:2)
我认为您正在寻找的是对象的post-order traversal,您可以在其中首先点击所有树叶,然后将序列化返回到父对象。如果你走这条路,虽然我建议使用迭代方法而不是递归方法,因为遍历一个非常复杂的对象可能会导致stack overflow。
这种方法的问题在于它仅在被序列化的对象是树时才有效。很多时候它们都是,但许多对象层次结构实际上是有向图。你可以很容易地拥有两个相互指向的复杂对象,在这种情况下你只能无限遍历。