我正在为C#.net 4.0应用程序使用protobuf-net v2 beta r431。在我的应用程序中,我有一个Dictionary<int, IMyClass>,我需要对其进行序列化。 MyClass类实现IMyClass接口(interface)。根据protobuf的文档,我将代码编写如下:

[ProtoContract]
[ProtoInclude(1, typeof(MyClass))]
public interface IMyClass
{
    int GetId();
    string GetName();
}

[ProtoContract]
[Serializable]
public class MyClass : IMyClass
{
    [ProtoMember(1)]
    private int m_id = 0;

    [ProtoMember(2)]
    private string m_name = string.Empty;

    public MyClass(int id, string name)
    {
        m_id = id;
        m_name = name;
    }

    public MyClass()
    {
    }

    #region IMyClass Members

    public int GetId()
    {
        return m_id;
    }

    public string GetName()
    {
        return m_name;
    }

    #endregion
}

但是,根据我的应用程序的设计,接口(interface)是在更高级别定义的(在与类不同的项目中),并且无法确定在编译时实现此接口(interface)的一个或多个类。因此,它给出[ProtoInclude(1,typeof(MyClass))]的编译时错误。我尝试使用[ProtoInclude(int标签,字符串KownTypeName)],如下所示:
[ProtoContract]
[ProtoInclude(1, "MyClass")]
public interface IMyClass
{
    int GetId();
    string GetName();
}

但是,这在行上引发了“未将对象引用设置为对象实例”异常
Serializer.Serialize(stream, myDict);

其中Dictionary myDict = new Dictionary(int,IMyClass)();
请让我知道在这种情况下如何使用ProtoInclude,以便在字典/列表中序列化接口(interface)类型。

最佳答案

Austin是正确的(我相信):使用程序集限定名称(作为字符串)应该可以解决此问题。

在v2中,存在一个附加选项:您可以在运行时执行映射,而不必通过属性执行映射:

RuntimeTypeModel.Default[typeof(PulicInterface)]
    .AddSubType(1, typeof(Implementation));

如果您的“应用”层了解这两种类型,则可以通过静态代码完成,也可以通过一些自定义配置/反射过程完成。

关于c# - protobuf-net的[ProtoInclude(1, "MyClass")]不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7585638/

10-10 01:30