Объединение объектов свойств Collection с использованием protobuf-net - PullRequest
3 голосов
/ 26 марта 2011

Попытка сохранить и восстановить объекты с помощью protobuf-net Merge. Я могу заставить работать простые объекты, но не могу получить объекты свойства коллекции в Merge. Любая помощь от экспертов protobuf-net приветствуется.

working code:

using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization;
using ProtoBuf;
class Program
{
    static void Main(string[] args)
    {
        ChildTest();
        ParentTest();

        Console.Write("Press any key to continue...");
        Console.ReadKey();
    }

    private static void ChildTest()
    {
        Console.WriteLine("ChildTest:");
        var child = new Child() {Name = "OriginalName"};

        var stream = new MemoryStream();
        Serializer.Serialize(stream, child);
        var tempChild = Serializer.Deserialize<Child>(new MemoryStream(stream.ToArray()));
        tempChild.Name = "MergedName";

        var stream1 = new MemoryStream();
        Serializer.Serialize(stream1, tempChild);
        child = Serializer.Deserialize<Child>(new MemoryStream(stream1.ToArray()));
        Console.WriteLine(child.Name + " - MergedName as expected");
    }

    private static void ParentTest()
    {
        Console.WriteLine("ParentTest:");
        var child = new Child() {Name = "OriginalName"};
        var parent = new Parent {Items = new List<Child>(1)};
        parent.Items.Add(child);

        var stream = new MemoryStream();
        Serializer.Serialize(stream,parent);
        var tempParent = Serializer.Deserialize<Parent>(new MemoryStream(stream.ToArray()));
        tempParent.Items[0].Name = "MergedName";

        var stream1 = new MemoryStream();
        Serializer.Serialize(stream1, tempParent);
        parent = Serializer.Merge(new MemoryStream(stream1.ToArray()), parent);
        Console.WriteLine(parent.Items[0].Name + " - MergedName expected here");

        Parent nullParent = null;
        nullParent = Serializer.Merge(new MemoryStream(stream1.ToArray()), nullParent);
        Console.WriteLine(nullParent.Items[0].Name+ " - MergedName as expected for null");
    }
}

[ProtoContract] //, ProtoInclude(2, typeof(Child[]))
public partial class Parent : ISerializable
{
    public Parent() { }

    [ProtoMember(1)]
    public List<Child> Items { get; set; }

    protected Parent(SerializationInfo info, StreamingContext context)
    {
        Serializer.Merge<Parent>(info, this);
    }
    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        Serializer.Serialize(info, this);
    }
}

[ProtoContract]
public partial class Child : ISerializable
{
    public Child() { }

    [ProtoMember(1)]
    public string Name { get; set; }

    protected Child(SerializationInfo info, StreamingContext context)
    {
        Serializer.Merge<Child>(info, this);
    }
    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        Serializer.Serialize(info, this);
    }
}

Очевидно, что это не может быть сделано с protobuf-net, - Есть ли какой-нибудь способ сделать то, что я пытаюсь сделать? перезаписать повторяющиеся свойства? может быть, другая библиотека?

1 Ответ

3 голосов
/ 27 марта 2011

Это ожидаемая функциональность;объединение свойства singular действительно перезаписывает свойства значениями из потока объединения;однако для повторяющихся свойств (списков, массивов и т. д.) поведение (согласно более широкому семейству реализаций "protobuf") заключается в добавлении дополнительных объектов из слиянияпоток в список.

Вы обнаружите, что:

    Console.WriteLine(parent.Items[0].Name); // prints OriginalName
    Console.WriteLine(parent.Items[1].Name) // prints MergedName

И, в частности, он не выполняет слияние элементов по позициям.

...