2012-01-16 26 views
3

私は、次のXMLがありますデシリアライズ不明なタイプ

<property name="someName" value="someValue" /> 

また、これは次のようになります。

<property name="someName" value="5" /> 

または:

<property name="someName" value="true" /> 

のように...

[Serializable] 
[XmlType("property")] 
public class Property 
{ 
    [XmlAttribute("name")] 
    public string Name { get; set; } 
    [XmlAttribute("value")] 
    public object Value { get; set; } 

    public Property() 
    { 

    } 
} 

上記のコードは動作しません。私は文字列、またはそれが常にその特定の型である限り、特定のものを使用することができます。オブジェクトは、既知の型の作業を許可することを望んでいました。

+2

文字列はすべての状況で機能しますが、アプリケーション全体で文字列として扱わなければなりません。それは選択肢ではありませんか? –

答えて

5

IXmlSerializableインターフェイスを使用してカスタムシリアル化を実装して手動で対処しない限り、XmlSerializerの属性のデータ型としてオブジェクトを使用することはできません。 Valueプロパティを属性としてシリアル化していない場合は、可能な既知の型(int、bool、stringなど)を指定するためにXmlIncludeを使用していた可能性があります。シリアライザはXMLに追加の属性を指定して、型を逆シリアル化する方法を知るようにします。しかし、属性を使用しているため、これはシナリオには当てはまりません。残念ですが、XML構造を再考するか、カスタムシリアル化を使用する必要があります。 XmlSerializerはこの状況に対処できません。

もう1つの可能性は、このプロパティをStringとして定義してシリアル化後処理を行うことです。おそらく、ゲッターだけを持つモデル上の別のプロパティーを定義し、このストリングの値に基づいたものは、それを基になる型に解析しようとするかもしれません。

1

文字列「5」を格納するか、実際の番号5を格納するかをxmlシリアライザがどのように認識しますか?

[Serializable] 
[XmlType("property")] 
public class Property 
{ 
    [XmlAttribute("name")] 
    public string Name { get; set; } 
    [XmlAttribute("value")] 
    public string StringValue { get; set; } 

    private object _Value; 
    [XmlIgnore] 
    public object Value 
    { 
     get 
     { 
      if (_Value == null) 
      { 
       _Value = CreateFromStringValue(); 
      } 
      return _Value; 
     } 
    } 

    public Property() 
    { 
    } 

    private object CreateFromStringValue() 
    { 
     // parse StringValue in here as you see fit (e.g. first try bool, then int, float, etc.) 
    } 
} 

として良くないが、あなたが必要とするすべてであるかもしれない:あなたはIXmlSerializableインターフェースを実装するか、回避策を適用行うことができるかもしれない必要がありますどちらか。

関連する問題