首页 新闻 搜索 专区 学院

ProtoBuf 反序列化读入含集合类的文件后,其集合的Count数量被累加,不知道什么原因

0
悬赏园豆:100 [已解决问题] 解决于 2022-05-10 20:40

有这么个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。

pukki的主页 pukki | 初学一级 | 园豆:112
提问于:2022-05-08 14:09
< >
分享
最佳答案
1

你另外写一个方法,不要写到构造函数里试下呢

收获园豆:100
三人乐乐 | 老鸟四级 |园豆:4306 | 2022-05-09 13:36

谢谢您的回答,这也是我目前的解决方法,既带集合类的变量,只能在构造函数里NEW,但不能在构造函数里初始化数据,只能如您所说,在外部添加数据,这跟我的理解相违背,有些初始化的数据最好写在构造函数里,所以发帖问一下,想知道原因。

pukki | 园豆:112 (初学一级) | 2022-05-10 20:37
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册