我正在为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/