开发者

Merging Collection property objects using protobuf-net

Trying to save and restore objects using protobuf-net Merge. I can get simple objects to work, but I cannot get collection property objects to Merge. Any help from protobuf-net experts is appreciated.

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);
    }
}

Apparently this cannot be done with protobuf-net, - Is there some way to do what I am trying to do? i.e overwrite repeated properties ? another library perhaps ?


This is the expected functionality; merging a singular property does indeed overwrite the properties with the values from the merging stream; however, for repeated properties (lists, arrays, etc) the behavior (as per the wider "protobuf" family of implementations) is to append the additional object(s) from the merging stream to the list.

You will find that:

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

And specifically, it does not do an item-by-item merge by position.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜