2011-02-24 30 views
5

假設我要反序列化的(我已經刪除了命名空間,使事情變得更簡單):當我只知道一個祖先類的類型時,我該如何反序列化一個XML?

<TextField> 
    <Caption>Location</Caption> 
    <Name>Location</Name> 
</TextField> 

文本字段從FormField繼承,所以在FormField我的類定義看起來是這樣的:

[KnownType(typeof(TextField))] 
[DataContract(Name = "FormField"] 
public abstract class FormField 
{ 
    [DataMember] 
    public string Name { get; set; } 
} 

TextField類看起來是這樣的:

[DataContract(Name = "TextField")] 
public class TextField : FormField 
{ 
    [DataMember] 
    public string Caption { get; set; } 
} 

我嘗試使用這種反序列化:

internal static FormField Deserialize(string xml) 
{ 
    var serializer = new DataContractSerializer(typeof(FormField)}); 
    using (var backing = new StringReader(xml)) 
    { 
     using (var reader = new XmlTextReader(backing)) 
     { 
      return serializer.ReadObject(reader) as FormField; 
     } 
    } 
} 

我得到一個SerializationException:「期待元素‘FormField’......」

+0

「TextField」是XML文件的根,還是「FormField」的根? – SwDevMan81 2011-02-24 21:46:44

+0

TextField是根。 TextField從FormField繼承,所以TextField是一種FormField。 – 2011-02-25 10:05:18

回答

0

爲了解決我的問題,我添加了一個容器節點到XML,所以它看起來是這樣的:

<FormFieldContainer> 
    <TextField> 
     <Caption>Location</Caption> 
     <Name>Location</Name> 
    </TextField> 
</FormFieldContainer> 

我創建了這個類:

[DataContract(Name = "FormFieldContainer")] 
internal class FormFieldContainer 
{ 
    [DataMember] 
    internal FormField FormField { get; set; } 
} 

我的反序列化方法是這樣的:

internal static FormField Deserialize(string xml) 
    { 
     var serializer = new DataContractSerializer(typeof(FormFieldContainer)); 
     using (var backing = new StringReader(xml)) 
     { 
      using (var reader = new XmlTextReader(backing)) 
      { 
       return ((FormFieldContainer)serializer.ReadObject(reader)).FormField; 
      } 
     } 
    } 

如果任何人有更好的解決方案,請分享:)

0

應該不是你的模型是這樣的呢?

public abstract class TextField: FormField 
{ 
    [DataMember] 
    public string Name { get; set; } 
} 

只是一個嘗試,其實我剛開始潛入DataContractSerializer的東西列表夜晚奇怪的。

+0

我在上面添加了我的TextField類,所以你可以看到它的樣子。 – 2011-02-25 10:11:00

相關問題