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