1

クラスのデータ メンバーをクライアント アプリケーションから非表示にしながら、XmlSerializer でシリアル化することは可能ですか?

コンテキストは、アドレスを断片的に取得していますが、オブジェクトを XML にシリアライズして別のものに渡す前に、それらの断片の多くを 1 つの文字列に連結する必要があるということです。

アドレスクラスはより大きなクラスの一部であるため、ネストされていない場合、このビットを単純に継承して追加するのはより複雑であり、カスタムシリアライザーを作成する必要性が十分ではありません。

サンプル:

[DataContract]
public class Address
{
    [DataMember()]
    public string City

    [DataMember()]
    public string State

    [DataMember()]
    public string StreetDirection

    [DataMember()]
    public string StreetName

    [DataMember()]
    public string StreetNumber

    [DataMember()]
    public string StreetSuffix

    [DataMember()]
    public string Unit

    [DataMember()]
    public string Zip

    [IgnoreDataMember()]
    [Serializable]
    public string AddressLine1
}

基本的には、渡す前に StreetXXX プロパティの連結を配置できるプレースホルダー (AddressLine1) が必要です (受信者が個々の部分を認識している場合は既にそうなっています)。

編集 - 例を追加 入力は次のようになります。

<Address>
  <StreetNumber>123</StreetNumber>
  <StreetDirection>S.</StreetDirection>
  <StreetName>Main</StreetName>
  <StreetSuffix>St.</StreetSuffix>
  <Unit>207</Unit>
  <City>Denver</City>
  <State>CO</State>
  <Zip>80123</Zip>
</Address>

しかし、私は次のようにシリアライズしたいと思います:

<Address>
  <StreetNumber>123</StreetNumber>
  <StreetDirection>S.</StreetDirection>
  <StreetName>Main</StreetName>
  <StreetSuffix>St.</StreetSuffix>
  <Unit>207</Unit>
  <City>Denver</City>
  <State>CO</State>
  <Zip>80123</Zip>
  <AddressLine1>123 S. Main St.</AddressLine1>
</Address>

ありがとう、

ジョン

4

2 に答える 2

3

XmlSerializer について言及しているが、DataContract クラスを表示しているため、質問は少し混乱しています。データは同じシリアライザーで逆シリアル化 (読み取り) およびシリアル化 (書き込み) されていますか? もしそうなら、それは DataContractSerializer ですか、それとも XmlSerializer ですか? それとも、DataContractSerializer で読み取り、XmlSerializer で書き込もうとしていますか? とにかく、DataContractSerializer を使用して読み取りと書き込みの両方を行うという単純なケースを想定すると、必要なことは、AddressLine1 を getter と setter を持つプロパティにして、[DataMember(IsRequired=false)] でマークすることだけです。次に、AddressLine1 プロパティ getter に住所連結コードを入力し、プロパティ setter では何もしません。このように、逆シリアル化では、AddressLine1 は無視されます (XML にまったく存在しない場合でも、エラーは発生しません)。

于 2012-10-09T22:04:29.777 に答える
1

AddressLine1プロパティをシリアル化する必要はまったくなく、ヘルパーの読み取り専用プロパティとして使用するだけでよいと思いました。

[IgnoreDataMember()]
public string AddressLine1
{
    get
    {
        return StreetNumber + " " + StreetDirection + " " + StreetName + " " + StreetSuffice;
    }
}

値は必要なときにいつでも作成できるため、プロパティのストリートセットに加えて、値をシリアル化して転送する意味はありません。もちろん、値をキャッシュし、ストリートプロパティの1つが実際に変更されたときにのみ値を再作成することで、実装をより効率的にすることができます。

于 2012-10-09T21:55:10.433 に答える