Мой сериализатор сериализует свойства и поля.
Если будет особый сложный тип, мой сериализатор не будет работать.
Я хотел бы добавить сериализацию пользовательских сложных типов и позволить возможность делать рекурсивный обход. Я новичок в программировании, и, честно говоря, я никогда не имел дело с рекурсивным обходом.
Это то, что у меня есть сейчас:
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; }
}
Я думаю, что вы ищете, это постобработка обхода объекта, где вы можете сначала ударить по всем листам и вернуть сериализацию до родительского объекта. Если вы пройдете этот маршрут, хотя я бы рекомендовал использовать итеративный подход, а не рекурсивный, поскольку перемещение очень сложного объекта может привести к переполнению стека.
Проблема с этим подходом заключается в том, что он работает только в том случае, если сериализуемые объекты являются деревьями. Много раз они есть, но многие иерархии объектов являются фактически ориентированными графами. Вы можете легко иметь два сложных объекта, которые указывают друг на друга, и в этом случае вы просто будете бесконечно перемещаться.