RuntimeTypeModel.Default [typeof(IMyClass2)]。AddSubType(1,typeof(MyClass))抛出“重复数据(列表,集合等)具有内置行为且不能被子类化”异常。以下是代码段
public partial class TestClass
{
public TestClass()
{
}
private void Serialize(object sender, EventArgs e)
{
Stream stream = new FileStream(resultFilePath,
FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None);
RuntimeTypeModel.Default[typeof(IMyClass2)].AddSubType(1, typeof(MyClass));
Serializer.Serialize(stream, myDict);
stream.Close();
}
private void DeSerialize(object sender, EventArgs e)
{
Stream stream = new
FileStream(resultFilePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None);
Dictionary<int, IMyClass2> myNewDict = Serializer.Deserialize<Dictionary<int, IMyClass2>>(stream);
stream.Close();
}
}
[ProtoContract]
[Serializable]
public class MyClass : IMyClass2
{
#region IMyClass2 Members
//members
#endregion
#region IEnumerable Members
public IEnumerator GetEnumerator()
{
throw new NotImplementedException();
}
#endregion
}
public interface IMyClass2 : IMyClass1
{
//members
}
public interface IMyClass1 : IEnumerable
{
//members
}
我应该如何处理此异常?请帮忙。
答案 0 :(得分:1)
protobuf-net已经(相当合理地)得出结论,你的基类型有一个集合类型。集合(与大多数其他序列化程序和数据绑定等一样)对各个项目的处理方式不同。在“协议缓冲区”中,这甚至更多发音,因为流中的容器 甚至不存在 - 所有序列化的都是个别元素。用xml术语说明这一点(澄清:protobuf-net 与xml无关 ,但这有助于可视化),然后在xml中那里子项目有两种方法:
<foo> <foo>
<items> <bar/>
<bar/> <bar/>
<bar/> <bar/>
<bar/> </foo>
</items>
</foo>
其中,protobuf-net更像是右侧上的示例 - 容器(items
)的所有都没有表示。
由于这个原因(与Google规范相关,而不是protobuf-net的实现),它无法存储特定于集合的任何内容,因此它无需任何注意任何细节,如继承(Google规范中不存在 ,但我可以针对单个项目进行处理)。
简而言之,我建议“不要那样做”。也许如果我更完整地理解这个场景,我可以给出一个更有用的答案。
注意(如上所述)可以处理个别项的继承,因此List<SomeBaseType>
可以包含DerivedType1
,{{1 }和DerivedType2
个实例。