protobuf.net c#obervablecollection

时间:2016-02-24 16:28:00

标签: c# collections protobuf-net

我正在尝试将从observablecollection派生的observable列表序列化。出于某种原因,当我反序列化它时,集合总是0个元素。当我将集合类型从observablelist更改为类“Test”中的observablecollection时,它可以正常工作。那么,我怎样才能实现我的班级也像普通列表一样处理。希望有人能帮助我。这是我的代码:

[Serializable]
[ProtoContract]
public class ObservableList<T> : ObservableCollection<T>
{
    ...
}    

[ProtoContract(ImplicitFields = ImplicitFields.AllPublic)]
public class Test
{
    public string Name { get; set; }
    public ObservableList<Hobby> Hobbies { get; set; } = new ObservableList<Hobby>();
}

[ProtoContract(ImplicitFields = ImplicitFields.AllPublic)]
public class Hobby
{
    public string Name { get; set; }
}

KR Manuel

3 个答案:

答案 0 :(得分:0)

这里似乎工作得很好......使用你的代码,并且:

static void Main()
{
    var test = new Test
    {
        Hobbies =
        {
             new Hobby { Name = "abc" }
        }
    };
    var clone = Serializer.DeepClone(test);
    Console.WriteLine("Same object? {0}",
        ReferenceEquals(test, clone));
    Console.WriteLine("Sub items: {0}",
        clone.Hobbies.Count);
    foreach (var x in clone.Hobbies)
    {
        Console.WriteLine(x.Name);
    }
}

给出输出:

Same object? False
Sub items: 1
abc

所以:反序列化的对象有正确的子项。

答案 1 :(得分:0)

我发现了最新情况。这里再次是我的Observablelist类:

[Serializable]
[ProtoContract]
public class ObservableList<T> : ObservableCollection<T>
{ 
    public void Add(IEnumerable<T> list)
    {
        foreach (var item in list)
            Add(item);
    }
}

如果我使用这个类它不起作用但是,如果我将Add()函数重命名为AddRange(),例如它。谁能告诉我这种奇怪行为的原因?

答案 2 :(得分:0)

  

如果我使用这个类它不起作用但是,如果我将Add()函数重命名为AddRange(),例如它。谁能告诉我这种奇怪行为的原因?

public class ObservableList<T> : ObservableCollection<T>
{ 
    public void Add(IEnumerable<T> list)
    {
        foreach (var item in list)
            Add(item);
    }
}

protobuf-net需要支持任意列表/集合 - 不仅仅是那些派生自List<T>或支持特定接口的列表/集合。它通过尝试解析合适的GetEnumerator()方法(用于序列化)和Add()方法(用于反序列化)来实现此目的。这里有不止一些检查和优先级,但听起来像在这种特定情况下它对你的意图感到困惑。