Как сделать сериализацию с рекурсивным обходом?

1

Мой сериализатор сериализует свойства и поля.
Если будет особый сложный тип, мой сериализатор не будет работать.
Я хотел бы добавить сериализацию пользовательских сложных типов и позволить возможность делать рекурсивный обход. Я новичок в программировании, и, честно говоря, я никогда не имел дело с рекурсивным обходом.

Это то, что у меня есть сейчас:

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
    Итак, насколько я понимаю ваш вопрос, вы хотите написать свой собственный сериализатор, правильно? Можете ли вы объяснить больше, какое требование заставляет вас делать это? Возможно, есть и другие возможности для достижения того, что вам нужно ...
  • 0
    Да, вы правильно поняли. Я пишу это, потому что мне любопытно. Сначала я хотел создать свой собственный простой сериализатор. Теперь я хочу сериализовать пользовательские сложные типы и добавить рекурсивный обход, но я не знаю, как это сделать
Теги:
recursion
serialization
tree-traversal
traversal

1 ответ

2
Лучший ответ

Я думаю, что вы ищете, это постобработка обхода объекта, где вы можете сначала ударить по всем листам и вернуть сериализацию до родительского объекта. Если вы пройдете этот маршрут, хотя я бы рекомендовал использовать итеративный подход, а не рекурсивный, поскольку перемещение очень сложного объекта может привести к переполнению стека.

Проблема с этим подходом заключается в том, что он работает только в том случае, если сериализуемые объекты являются деревьями. Много раз они есть, но многие иерархии объектов являются фактически ориентированными графами. Вы можете легко иметь два сложных объекта, которые указывают друг на друга, и в этом случае вы просто будете бесконечно перемещаться.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню