如何在作为集合的类型上使用AddSubType?

时间:2011-09-29 09:36:18

标签: c# protobuf-net

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
}

我应该如何处理此异常?请帮忙。

1 个答案:

答案 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个实例。