有这么个Class1类,里面有含100个值的 ObservableCollection列表,序列化保存后再读入,
ObservableCollection 里IsExpanded 不是100个值,而变成200个值,有知道原因么?
注:采用了ServiceStack.ProtoBuf的 序列化及反序列
[ProtoContract]
internal class Class1
{
public Class1()
{
// 生成100个bool值
IsExpanded = new ObservableCollection<bool>(new List<bool>(new bool[100]));
}
[ProtoMember(1)]
public ObservableCollection<bool>? IsExpanded { get; set; }
}
// 序列化写出
private void button1_Click(object sender, EventArgs e)
{
Class1 class1 = new Class1();
using var file = File.Create(@"d:\1.test");
ProtoBuf.Serializer.Serialize(file, class1);
}
//读入
private void button2_Click(object sender, EventArgs e)
{
using var file = File.OpenRead(@"d:\1.test");
var data= ProtoBuf.Serializer.Deserialize<Class1>(file);
//读入文件后,显示 列表的count 不是100,而是200,为什么
textBox1.Text = data.IsExpanded?.Count.ToString();
}
经过研究发现,不仅仅是ObservableColletion ,包括List,数组等集合类,都会导列表Count的翻倍,初步认为,ProtoBuf 在反序列化的时候会访问构造函数,如果在构造函数里NEW 一个含100个值的列表,再加上从文件中读入的100个值的列表,这样就变成200个值的列表了,
不知道这是不是 ProtoBuf的bug。
你另外写一个方法,不要写到构造函数里试下呢
谢谢您的回答,这也是我目前的解决方法,既带集合类的变量,只能在构造函数里NEW,但不能在构造函数里初始化数据,只能如您所说,在外部添加数据,这跟我的理解相违背,有些初始化的数据最好写在构造函数里,所以发帖问一下,想知道原因。