protobuf.net c# obervablecollection

protobuf.net c# obervablecollection

我正在尝试让我的 observablelist 派生自 observablecollection 以进行序列化。出于某种原因,当我反序列化时,该集合始终包含 0 个元素。当我在 class "Test" 中将集合类型从 observablelist 更改为 observablecollection 时,它工作正常。那么,我怎样才能让我的 class 也像普通列表一样被处理。希望有人能帮助我。这是我的代码:

[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 曼努埃尔

这里似乎工作正常...使用您的代码,并且:

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

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

我知道是怎么回事了。又是我的 Observablelist Class:

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

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

If I use this Class it's not working but, if i rename the Add() function to AddRange() for example it is. Can anyone tell me the reason for this strange behaviour?

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() 方法(用于反序列化)来做到这一点。其中内置了很多检查和优先级,但听起来 在这种特定情况下 它对您的意图感到困惑。