2012-01-16 113 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

字符串將適用於所有這些情況,但是您必須在整個應用程序中將其視爲字符串。這不是一個選項嗎? – 2012-01-16 22:43:27

回答

5

僅僅使用對象作爲XmlSerializer屬性的數據類型是不可能的,除非您使用IXmlSerializable接口實現自定義序列化並手動處理情況。如果您沒有將Value屬性序列化爲屬性,則可以使用XmlInclude來指定可能的已知類型(如int,bool,string,...),並且序列化程序將在XML上發出附加屬性以指定確切的鍵入以便它知道如何反序列化。但是,所有這些都不適用於您的場景,因爲您正在使用屬性。這是不幸的,但你將不得不重新考慮你的XML結構或使用自定義序列化。 XmlSerializer根本無法處理這種情況。

另一種可能性是將此屬性定義爲字符串並進行後序列化處理。也許甚至可以在模型上定義另一個只有getter的屬性,並且基於此字符串的值可能會嘗試將其解析爲某種基礎類型。

1

那麼,xml序列化程序如何知道您是要存儲字符串「5」還是實際的數字5?你要麼需要實現IXmlSerializable接口或者你可能能夠做應用解決方法:

[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.) 
    } 
} 

並不像不錯,但可能是你所需要的。