このようなメッセージング用の抽象クラスを公開するサードパーティのライブラリがあります。
[ProtoContract]
public abstract class MessageBase
{
[ProtoMember(101)]
public string ErrorMessage { get; set; }
public abstract int Type { get; }
}
今私のアプリケーションでは、それから派生クラスを作成します
[ProtoContract]
[ProtoInclude(999, typeof(MessageBase))]
public class Echo : MessageBase
{
public const int ID = 1;
public override int Type
{
get { return ID; }
}
[ProtoMember(1)]
public string Message { get; set; }
}
しかし、基本クラスのプロパティ ErrorMessage を (de)/serialize しようとすると、無視されます。状況をシミュレートするコードを次に示します。
using (MemoryStream ms = new MemoryStream())
{
Echo echo = new Echo{Message = "Some message", ErrorMessage = "XXXXX"};
ProtoBuf.Serializer.Serialize(ms, echo);
//reset ms
ms.Seek(0, SeekOrigin.Begin);
Echo echo1 = (Echo)ProtoBuf.Serializer.NonGeneric.Deserialize(typeof(Echo), ms);
Debug.Assert(echo.ErrorMessage == echo1.ErrorMessage, "Must be the same");
}
ProtoInclude について読みましたが、派生クラスでは無視されているようです。
基本クラスを変更できません。サードパーティ ライブラリのソース コードがありません。
MessageBase から約 100 の派生クラスがあるかもしれません。
非ジェネリック バージョンのデシリアライゼーションを使用する必要があります。これは、型が実行時にしかわからないためです。
問題を解決するにはどうすればよいですか?
どうも