Я использую protobuf-net v2 beta r431 для приложения на C # .net 4.0. В моем приложении у меня есть Dictionary<int, IMyClass>
, который мне нужно сериализовать. Класс MyClass
реализует интерфейс IMyClass
. В соответствии с документацией 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
}
Однако, согласно дизайну моего приложения, интерфейс определен на более высоком уровне (в проекте, отличном от классов), и невозможно определить класс / классы, которые реализуют этот интерфейс во время компиляции. Следовательно, он дает ошибку времени компиляции для [ProtoInclude (1, typeof (MyClass))]. Я попытался использовать [ProtoInclude (int tag, string KownTypeName)] следующим образом:
[ProtoContract]
[ProtoInclude(1, "MyClass")]
public interface IMyClass
{
int GetId();
string GetName();
}
Но в строке
выдается исключение "Ссылка на объект не установлена на экземпляр объекта".
Serializer.Serialize(stream, myDict);
где Dictionary myDict = new Dictionary (int, IMyClass) ();
Пожалуйста, дайте мне знать, как использовать ProtoInclude в этом случае, чтобы сериализовать тип интерфейса внутри словаря / списка.