[英]CollectionDataContract serialization not adding custom properties (DataMember)
我们有一个遗留系统,需要以最非结构化的格式馈送(XML)数据。 .NET DataContractSerializer
甚至可能实现以下目的?
鉴于以下DataContracts
[CollectionDataContract(Name = "Options", ItemName = "Option")]
public class OptionItemCollection : List<OptionItem>
{
[DataMember(Name = "Name")]
public string Name { get; set; }
public OptionItemCollection()
{
}
public OptionItemCollection(IEnumerable<OptionItem> items) : base(items)
{
}
}
[DataContract(Name = "Option")]
public class OptionItem
{
[DataMember]
public string Text { get; set; }
[DataMember]
public string Value { get; set; }
}
是否可以将此集合直接序列化为以下XML表示形式:
<Options>
<Name>Juices</Name>
<Option Value="1">Orange Juice</Option>
<Option Value="2">Pineapple</Option>
<Option Value="3">Fruit Punch</Option>
</Options>
注意:这正是旧系统期望提交数据的方式。
甚至:
<Options>
<Name>Juices</Name>
<Option><Value>1</Value><Text>Orange Juice</Text></Option>
<Option><Value>2</Value><Text>Pineapple</Text></Option>
<Option><Value>3</Value><Text>Fruit Punch</Text></Option>
</Options>
还要注意 ,强调的是居住在选项元素中的名称和Option元素。
是。 尽管DataContractSerializer
不显式支持XML属性,但是您可以手动滚动它。 尝试这个:
[CollectionDataContract(Name = "Options", ItemName = "Option")]
public class OptionItemCollection : List<OptionItem>
{
[DataMember(Name = "Name")]
public string Name { get; set; }
public OptionItemCollection()
{
}
public OptionItemCollection(IEnumerable<OptionItem> items)
: base(items)
{
}
}
// note, remove attributes
public class OptionItem : IXmlSerializable
{
public string Text { get; set; }
public string Value { get; set; }
public void WriteXml(XmlWriter writer)
{
writer.WriteAttributeString("Value", Value);
writer.WriteElementString("Text", Text);
}
public void ReadXml(XmlReader reader)
{
// implement if necessary
throw new NotImplementedException();
}
public System.Xml.Schema.XmlSchema GetSchema()
{
throw new NotImplementedException();
}
}
不可以,这对于DataContractSerializer
(DCS)是不可能的。 DCS不允许展开的收集元素。 所以你不能有这个:
<a>
<b/>
<b/>
<b/>
<c/>
</a>
但是您可以拥有:
<a>
<bb>
<b/>
<b/>
<b/>
</bb>
<c/>
</a>
在您的方案中,您需要使用XmlSerializer
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.