让我们假设我想反序列化这个(我删除了名称空间以使事情更简单):
<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'......”
答案 0 :(得分:0)
那么你的模型不应该这样吗?
public abstract class TextField: FormField
{
[DataMember]
public string Name { get; set; }
}
只是一个刺,我实际上刚刚开始潜入DataContractSerializer的东西列表奇怪的夜晚。
答案 1 :(得分: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;
}
}
}
如果有人有更好的解决方案,请分享:)