具有字典属性的Protobuf-net类
本文关键字:Protobuf-net 属性 字典 | 更新日期: 2023-09-27 17:49:26
给定下列类,
public static void Test()
{
var bigDictionary = new Dictionary<string, TestClass>();
bigDictionary.Add("entry1", new TestClass());
bigDictionary.Add("entry2", new TestClass());
bigDictionary.Add("entry3", new TestClass());
// EDIT: Added these lines
bigDictionary["entry1"].MyDictionary.Add(1, new SecondTestClass() { MyVar = "hello" });
bigDictionary["entry1"].MyDictionary.Add(2, new SecondTestClass() { MyVar = "world" });
bigDictionary["entry2"].MyDictionary.Add(1, new SecondTestClass() { MyVar = "please" });
bigDictionary["entry2"].MyDictionary.Add(2, new SecondTestClass() { MyVar = "work" });
using (var file = System.IO.File.Create("test.temp"))
{
ProtoBuf.Serializer.Serialize(file, bigDictionary);
}
Dictionary<string, TestClass> outDict = null;
using (var file = System.IO.File.OpenRead("test.temp"))
{
outDict = ProtoBuf.Serializer.Deserialize<Dictionary<string, TestClass>>(file);
}
// EDIT: You'll notice these asserts fail
System.Diagnostics.Debug.Assert(outDict["entry1"].MyDictionary.ContainsKey(1));
System.Diagnostics.Debug.Assert(outDict["entry1"].MyDictionary.ContainsKey(2));
System.Diagnostics.Debug.Assert(outDict["entry2"].MyDictionary.ContainsKey(1));
System.Diagnostics.Debug.Assert(outDict["entry2"].MyDictionary.ContainsKey(2));
}
[System.Runtime.Serialization.DataContract]
public class TestClass
{
public TestClass()
{
MyDictionary = new Dictionary<int,SecondTestClass>();
}
[System.Runtime.Serialization.DataMember]
public Dictionary<int, SecondTestClass> MyDictionary { get; set; }
}
[System.Runtime.Serialization.DataContract]
public class SecondTestClass
{
[System.Runtime.Serialization.DataMember]
public string MyVar { get; set; }
}
(如何)我可以得到bigDictionary
序列化而不抛出以下异常?
"Only data-contract classes (and lists/arrays of such) can be processed (error processing Dictionary`2)"
(我已经尝试标记与DataContract/DataMember ProtoContract/ProtoMember等,但似乎没有工作)
提前感谢您的帮助。
编辑:看来我已经弄明白了。对于上面编辑过的代码,您会注意到断言失败。所以看起来内部字典根本没有被序列化。但是,如果我将datcontract标签更改为Protobuf。ProtoContract(和DataMember到ProtoMember),它正确地获取内部字典。是我误用了库还是这是一个bug?
答案是抛出的异常有点误导人,它是字典中对象的序列化错误,而不是字典本身。我所处理的实际实现比我给出的例子要复杂一些,因此有一个object类型的变量破坏了它。
据我所知,DataContract/DataMember在WCF合约中被大量使用(至少,这是我所知道的)。您还可以查看[Serializable]属性,它可能更适合您的情况。
欢呼,佩里