2016-11-02 8 views
0

のない私には、以下のクラスの断片を持っている:C#XMLシリアル化ラッパー

public class varString 
{ 
    public string KeyWord; 
    public string Value; 
    public static implicit operator string(varString v) 
    { 
     return v == null ? null : (string)v.Value; 
    } 
} 

キーワードはnullにすることが許可されています。

XMLにシリアライズするとキーワードがnullのとき、私は次のような出力が得られます。

<varString> 
    <Value>value goes here</Value> 
</varString> 

は私が出力するXMLシリアライザを取得するにはどうすればよい場合は、次のキーワードがnullの場合のみ?:

<varString>value goes here</varString> 

キーワードがnullでない場合、私はまだ出力に次のようにそれが欲しい:

<varString> 
    <!-- Can either be <Value></Value or just straight text --> 
    <KeyWord>KeyWord goes here</KeyWord> 
<varString> 

このケースを処理して、孤立した文字列をnull KeyWordのvarStringに変換するために、deserializeイベントを既に変更していることに注意してください。

public class varString 
{ 
    [XmlText] 
    public string Value; 
    public string KeyWord; 
    public static implicit operator string(varString v) 
    { 
     return v == null ? null : (string)v.Value; 
    } 
} 

サンプルfiddle:属性[XmlText]

+1

なぜそれが必要ですか?それはXMLを受け手のために解析するのを難しくします。 –

+0

このようにXMLを編集する方が簡単です。 KeyWordは9/10倍のヌルなので、余分なタグの出力はしません。ただ個人的な好みはすべてです、本当に何にも影響しません。 – Hondros

答えて

1

マークValue。我々はXmlTextAttributeまたはXmlElementAttribute追加KeyWordた値に応じて

var vs = new varString(); 
vs.KeyWord = "key"; // null; 
vs.Value = "value"; 


var attr = new XmlAttributes(); 

if (vs.KeyWord == null) 
    attr.XmlText = new XmlTextAttribute(); 
else 
    attr.XmlElements.Add(new XmlElementAttribute { ElementName = "Value" }); 

var overrides = new XmlAttributeOverrides(); 
overrides.Add(typeof(varString), "Value", attr); 


var xs = new XmlSerializer(typeof(varString), overrides); 
xs.Serialize(Console.Out, vs); 

+0

これは、フィドルで動作しますが、私はそれが私のコードでこれらを含むより複雑なオブジェクトで動作するように見えることができません。しかし、私はこれが最も簡単で簡単な解決策だと思うので、答えとしてマークしています。 – Hondros

+0

@Hondros - ドキュメントの[備考](https://msdn.microsoft.com/en-us/library/system.xml.serialization.xmltextattribute.aspx#Remarks)セクションを確認してください。 * XmlTextAttributeクラスの1つのインスタンスのみをクラス*。*に適用できます。XmlTextAttributeは、プリミティブ型と列挙型を返すパブリックフィールドとパブリックの読み書きプロパティに適用できます。* – dbc

+1

Hm interesting。私は、定義されたvarStrings:https://dotnetfiddle.net/yan3tsを持つクラスをサポートするかどうかを調べるために、あなたのフィドルを修正しました。そしてそれは実際に働く。私はここからそれを理解することができると確信しています。本当にありがとう! – Hondros

0

は、このアプローチを試してみてください。

+0

残念ながら、各varStringはケースバイケースでnullキーワードを持ち、コンテナクラスを使用して複数のvarStringを保持しています。 – Hondros

+0

@Hondros - はい、複数の値の場合は適用されません。 –

+1

'XmlAttributeOverrides'を使ってシリアライザを構築する場合、シリアライザをキャッシュする必要があります。 [StreamReaderとXmlSerializerを使用したメモリリーク](https://stackoverflow.com/questions/23897145)を参照してください。 – dbc