2010-11-28 7 views
8

属性のシリアル化をカスタマイズするユーザーを探しています。私はそれが簡単だろうと思ったが、私が望むようにしたいと思ったことを達成することができなかった。だからここカスタムXmlAttributeシリアル化を作成する方法

は簡単な例です:

クラス定義:

Class MyClass 
{ 
    [XmlAttribute("myAttribute")] 
    public int[] MyProperty { get; set; } 
} 

XMLは、私が好きだろうと結果:私の周りだけの仕事はそれがすることだった持っていた

<MyClass myAttribute="1 2 3... N" /> 

[XmlIgnore]属性を設定し、変換を行ったコードを含む別のプロパティを作成します。

私の質問ですが、新しいプロパティを作成するよりも良い方法はありますか?たぶんシリアライザが使用するように作成できるTypeConverterがありますか?

また、Type属性を使用しようとしましたが、成功しませんでした。 (常に例外を取得する)。しかし、私が読んだことから、すでに定義されているデータ型のためです。

[XmlAttribute("myAttribute", typeof(MyConverter))] 
public int[] MyProperty { get; set; } 

もう一つの興味深い方法は、そのようになります:

[XmlAttribute("myAttribute")] 
[XmlConverter(typeof(MyConverter))] 
public int[] MyProperty { get; set; } 

感謝。


編集 私が探していたような解決策が提示されなかったので、私は最終的に「IXmlSerializable」ソリューションを選ぶことにしました。

答えて

3

次のいずれかを実行できます。

  1. IXmlSerializableを実装し 代理プロパティを使用し
  2. 手動 あなたのタイプのためのすべての シリアライズ/デシリアライゼーションのハンドル:

    [XmlIgnore] 
    public int[] MyProperty { get; set; } 
    
    
    [XmlAttribute("myAttribute")] 
    public string _MyProperty 
    { 
        get 
        { 
         return string.Join(" ", MyProperty.Select(x => x.ToString()).ToArray()); 
        } 
        set 
        { 
         MyProperty = value.Split(' ').Select(x => int.Parse(x)).ToArray(); 
        } 
    } 
    
+0

あなたの代理プロパティはまさに彼が避けようとしているものです。 – SLaks

+0

行頭に空白(4など)を追加するだけです。また、キャリッジリターンが2つあることを確認してください。あなたの答えは、私はあなたの2番目の可能性を避けたいと思っていました。最初は、私はその解決法に頼りたくはありませんでしたが、おそらくそれが唯一の解決策です。私は私の "配列クラス"を作成することはあまりにも悪くないと思います。 – Sauleil

+0

@SLaks:この種の機能は「バグ」と呼ばれます;-) –

関連する問題