1

このようなメッセージング用の抽象クラスを公開するサードパーティのライブラリがあります。

    [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 の派生クラスがあるかもしれません。

非ジェネリック バージョンのデシリアライゼーションを使用する必要があります。これは、型が実行時にしかわからないためです。

問題を解決するにはどうすればよいですか?

どうも

4

1 に答える 1