1

シリアル化された基本クラスがあります。

[ProtoContract]
public class Web2PdfEntity 
{   


        [ProtoMember(1)]
        public string Title { get; set; }
        [ProtoMember(2)]
        public string CUrl { get; set; }
}

Web2PdfEntity クラスを Web2PdfEntity から継承した Web2PdfServer にデシリアライズしたいと考えています。

public class Web2PdfServer : Web2PdfEntity
{

public void MyServerMethod {}
public void MyServerMethod2{}
}

以下のコードを使用してクラスを逆シリアル化しようとしましたが、残念ながらプロパティが設定されていません。

var web2Pdf = Serializer.Deserialize<Web2PdfServer>("c:\Web2PdfEntity-class-to-serialize-file.bin");
web2Pdf.Title //<- not deserialized
web2Pdf.CURL //<- not deserialized
4

1 に答える 1

2

(大幅に修正)

コメントに基づいて、提示されたシナリオは次のとおりです。

  • たまたまC#のサブクラスである2つのタイプがあります
  • シリアル化では、それらの間でフラットに交換したいだけです-継承コードはありません(つまり、として保存して、またはvvWeb2PdfEntityとしてロードできます)Web2PdfServer

これは、継承された型がシリアル化 (データを変更する) 中に継承を期待し、コントラクトが適合する限り、無関係な型が交換可能である通常のユース ケースとは少し異なります。

これにはいくつかの方法があります。マイナーな問題の 1 つは、重複を避けるために、既定では継承されたプロパティを参照しないことです。それらを再宣伝することもできますが、それは少し不格好です。個人的には、アプリの起動時に何をすべきかを伝えたいと思うでしょう:

var metaType = RuntimeTypeModel.Default.Add(typeof(Web2PdfServer), false);
metaType.Add(1, "Title").Add(2, "CUrl");

これで、示されている 2 つのプロパティを含め、既存のSerializerコードがWeb2PdfServer正しく処理されます。

于 2011-06-28T11:19:34.337 に答える