WCF DataMember List<>没有封闭元素

3
以下是数据契约(DataContract):
    [DataContract(Namespace = "http://namespace", Name = "Blarg")]
    public class Blarg
    {
        [XmlAttribute("Attribute")]
        public string Attribute{ get; set; }

        [DataMember(Name = "Record", IsRequired = false, Order = 4)]
        public List<Record> Record{ get; set; }
    }

序列化为以下内容:
<Blarg Attribute="blah">
    <Record>
        <Record/>
        <Record/>
        <Record/>
    </Record>
</Blarg>

但我想要这个:
<Blarg>
    <Record/>
    <Record/>
    <Record/>
<Blarg/>

DataContractSerializer 似乎会自动插入头部父元素,但我不想要它。
如何去除包装的 <Record>

2
为什么你在使用“XmlAttribute”?数据合同序列化器从不使用属性。 - John Saunders
XmlAttribute可以通过DataContract Serializer进行序列化而不会出现任何问题,但这并不是我遇到的问题。 - Ryan
1
它并不像属性一样序列化,这就是它的 XmlAttribute 的目的。我建议你将其删除,看看会发生什么。 - John Saunders
2个回答

2

我认为你做不到那件事。

DataContractSerializer 是为了速度而优化的,因此它在某些灵活性和一些特性上进行了牺牲(比如XML属性)。我认为你没有太多机会去影响DCS - 它会按照最适合自己的方式尽快完成工作。你可以使用 [DataMember] 属性来清晰地定义要序列化的内容,但对于序列化的方式,你并无决定权。

如果你需要更多控制,你可以选择使用 XmlSerializer,在这种情况下,你会有10-15%的序列化速度降低,但你可以控制数据的形状等参数。但即使是在这种情况下 - 我不知道任何方法能够让XML序列化器将一个集合序列化成一系列XML标签而不需要集合的封闭标签。


我转换到了XmlSerializer,并且成功移除了封装标签。感谢您的帮助! - Ryan
3
@Ryan: 介意分享一下你是如何做到这个的吗?你可以用那个解决方案回答你自己的问题——对某些人,某天或许有所帮助。 - marc_s

0

我在这里找到了答案。 以下是简短的故事(如需详细内容请查看链接):

 [XmlElement ("Parameter")]
    public List<Parameter> Parameters;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接