根据 XSD生成 Data Contract之怪现象

1. 如果在xml中一个complexType的属性中包含一个属性组A,而在属性组A中又包含属性组B,则B的所有属性在生成类文件时,会被忽略。

    微软对此也有详细说明:http://msdn.microsoft.com/en-us/library/484632e7(v=vs.80).aspx

    有个解决方法是写一个xsl文件,将所有嵌套的属性组遍历出来,写在最外层,然后再对该文件生成.

2. 明明赋了值,也有xmlAttribute,但是序列化出来的文件里,该属性的值却丢失了

    i.e.

   XSD:

           <xs:attribute name="Start" type="xs:datetime" use="optional" />

   生成如下代码:

        [System.Xml.Serialization.XmlAttributeAttribute(DataType = "date")]
        public System.DateTime Start
        {
           ...
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool StartSpecified
        {
            ...
        }


         这里, 不仅要设置obj.Start = ..., 还要加上obj.StartSpecified = true;

         原因:http://msdn.microsoft.com/zh-cn/library/w6sktzs3(v=vs.80).aspx              

         简单解释:

               未指定 default 的 optional:Xsd.exe 生成一个具有 XmlAttributeAttribute 的公共字段。
               此外,如果该属性的类型不是引用类型(例如字符串),它会生成一个 bool 类型的公共字段,该字段的名称为该属性字段的名称再追加 Specified。
               例如,如果属性字段的名称为 start,则 bool 字段的名称将为 startSpecified。将某个对象序列化为 XML 时,
               XmlSerializer 类检查 bool 字段的值,以确定是否写入可选的属性。
               出现的 bool 字段具有 System.Xml.Serialization.XmlIgnoreAttribute,可防止它被 XmlSerializer 序列化。

原文地址:https://www.cnblogs.com/DataFlow/p/2116815.html