繁体   English   中英

当我只知道祖先类的类型时,如何反序列化XML?

[英]How can I deserialize an XML, when I only know the type of an ancestor class?

让我们假设我想反序列化这个(我删除了名称空间以使事情变得更简单):

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

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'......”

你的模特不应该这样吗?

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

只是一个刺,我实际上刚刚开始潜入DataContractSerializer的东西列表奇怪。

为了解决我的问题,我在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;
            }
        }
    }

如果有人有更好的解决方案,请分享:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM