protobuf.net c# obervablecollection

本文关键字:obervablecollection net protobuf | 更新日期: 2023-09-27 18:36:12

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

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

protobuf.net c# obervablecollection

如果我

使用这个类,它不起作用,但是,如果我将 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()方法(用于反序列化)来实现此目的。其中内置了不止一些检查和优先级,但听起来在这种特定情况下,它对您的意图感到困惑。

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

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

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

我发现了发生了什么。这里又是我的可观察列表类:

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

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

相关文章:
  • 没有找到相关文章