2016-12-28 5 views
0

List<String>オブジェクトにページのリストを持つ属性を逆シリアル化しようとしています。スペース区切り文字を使用すると、デシリアライズすることはできますが、カンマまたは垂直バーでよりきれいに見えるようにしたいと思います。リストにxml属性をデシリアライズ<String>

それはList<String>またはList<int>

<Node Pages="1,2"> 

をデシリアライズすることは可能ですか?

私のクラスも簡単です。

public List<int> Pages; 
+1

スペース区切り文字を使用して逆シリアル化できる方法は、コンマ区切りリストも使用して逆シリアル化できるはずです。あなたはその問題に直面していますか? –

+0

値の区切りを変更する方法は見ていません。以下の答えは私が考えている可能性のある解決法と似ています。 – Histerical

答えて

1

XmlSerializerは、属性のためにこれをそのまま受け入れません。 XMLの構造を制御している場合は、XMLの目的を文字列で区切った属性文字列を使用することから、子要素の使用を検討してください。

計算されたプロパティを使用することもできます。しかし、このプロパティにアクセスするたびにカンマで区切られた文字列を解析するため、これは遅くなることに注意してください。

[XmlAttribute(AttributeName = "Pages")] 
public string PagesString { get; set; } 

public IList<int> Pages { 
    get { 
     return PagesString.Split(',').Select(x => Convert.ToInt32(x.Trim())).ToList(); 
    } 
    set { 
     PagesString = String.Join(",", value); 
    } 
} 

また、この愚かな実装では、文字列に間違った入力がある可能性があることを考慮していません。あなたもそれを守るべきです。

ページプロパティにアクセスするたびに、新しいコレクションが返されることに注意してください。戻り値にAdd()を呼び出すと、この変更はXMLに反映されません。

+0

xmlをデシリアライズした後にこれを変更する方が効率的でしょうか?それがアクセスされるたびに解析する必要がある場合、非常に非効率なようです。 – Histerical

+0

これにアクセスする予定に応じて異なります。これがXMLを読み込むための便利なプロパティであれば、おそらく1回しかアクセスされないため、とにかく(あなたまたはデシリアライザのどちらかで)これを行う必要があります。 – mstaessen

+0

私はこの解決策が本当に好きです。ちょうどget; set;文字列を解析します。しかし、ページ範囲などの異なる処理も可能です。ご協力ありがとうございました! – Histerical

関連する問題