我正在尝试将从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
答案 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()
方法(用于反序列化)来实现此目的。这里有不止一些检查和优先级,但听起来像在这种特定情况下它对你的意图感到困惑。