【问题标题】:Serialize an Enumeration to an XML Attribute将枚举序列化为 XML 属性
【发布时间】:2011-10-06 18:10:40
【问题描述】:

我从许多 XSD 中生成了 100 个以上的类来构建我们的测试工具应用程序以进行内部测试。我正在使用 XSD.exe 来生成这些类,因为这样做会带来太大的风险并且需要很长时间。

我遇到了一个让我有点痛苦的问题。我正在尝试获取此枚举(现在仅此一个,然后我将对其余的进行相同的技术...)

我想要的是生成这样的东西(其中接收器元素具有 typeCode 属性):

<receiver typeCode="RCV">
    <device classCode="DEV" determinerCode="INSTANCE">
        <id root="..." extension="..." />
        <asAgent classCode="AGNT">
            <representedOrganization classCode="ORG" determinerCode="INSTANCE">
                <id root="..." extension="..." />
            </representedOrganization>
        </asAgent>
    </device>
</receiver>

但是,即使我已经在测试工具启动对象中明确设置,接收者也永远不会获得属性:

   this.receiver = new MCCI_MT000100BCReceiver();
   this.receiver.typeCode = CommunicationFunctionType.RSP;
   this.receiver.device = new MCCI_MT000100BCDevice();

我有一个枚举(我添加了 XMLEnums 和 [Flags] 属性,因为 XSD.exe 没有打扰)

[Flags]
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "urn:hl7-org:v3")]
public enum CommunicationFunctionType
{

    /// <remarks/>
    [System.Xml.Serialization.XmlEnum("RCV")]
    RCV = 1,

    /// <remarks/>
    [System.Xml.Serialization.XmlEnum("RSP")]
    RSP = 2,

    /// <remarks/>
    [System.Xml.Serialization.XmlEnum("SND")]
    SND = 3,
}

这是使用该枚举的类之一:

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(TypeName = "MCCI_MT000100BC.Receiver", Namespace = "urn:hl7-org:v3")]
    public partial class MCCI_MT000100BCReceiver
    {

        private CS[] realmCodeField;

        private II typeIdField;

        private II[] templateIdField;

        private MCCI_MT000100BCDevice deviceField;

        private CommunicationFunctionType typeCodeField;

        private bool typeCodeFieldSpecified;

        public MCCI_MT000100BCReceiver()
        {
            this.typeCodeField = CommunicationFunctionType.RCV;
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("realmCode")]
        public CS[] realmCode
        {
            get
            {
                return this.realmCodeField;
            }
            set
            {
                this.realmCodeField = value;
            }
        }

        /// <remarks/>
        public II typeId
        {
            get
            {
                return this.typeIdField;
            }
            set
            {
                this.typeIdField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("templateId")]
        public II[] templateId
        {
            get
            {
                return this.templateIdField;
            }
            set
            {
                this.templateIdField = value;
            }
        }

        /// <remarks/>
        public MCCI_MT000100BCDevice device
        {
            get
            {
                return this.deviceField;
            }
            set
            {
                this.deviceField = value;
            }
        }

        /// <remarks/>

        [System.Xml.Serialization.XmlAttributeAttribute()]
        public CommunicationFunctionType typeCode
        {
            get
            {
                return this.typeCodeField;
            }
            set
            {
                this.typeCodeField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool typeCodeSpecified
        {
            get
            {
                return this.typeCodeFieldSpecified;
            }
            set
            {
                this.typeCodeFieldSpecified = value;
            }
        }
    }

我知道序列化枚举不是 .NET 有时喜欢做的事情,但我们将不胜感激。

【问题讨论】:

  • 枚举是在xsd中定义的吗?
  • @Jayanta - 是的,它已定义。我总共有大约 100 个,而 XSD 只带来了 90% 以上,因为它不喜欢有限制的多个嵌套联合。

标签: c# xml xsd xml-serialization


【解决方案1】:

.net/XML 中的枚举没有问题;问题只是您(或 xsd)添加了一个“typeCodeSpecified”成员。这是一个用于有条件地包含值的模式 - 具体来说,对于名为“Foo”的成员,引擎会检查“FooSpecified”属性或“ShouldSerializeFoo()”方法。由于您从未将“typeCodeSpecified”设置为true,因此它将返回false,并且在序列化过程中将省略该成员。

如果您不希望这样做,请删除此成员。

【讨论】:

  • 你是 100% 正确的。 TypeCodeSpecified - 这是 XSD.exe 添加的内容。但是,我对这将如何影响 TypeCode 属性有点迷茫。
  • @Ryan 我试图解释一下 ;p 这只是一个基于名称的模式。如果你一个名为“typeCode”的属性和一个名为“typeCodeSpecified”的属性,那么仅凭名字,“typeCodeSpecified”的目的是控制是否有“typeCode” " 被写入输出。如果在输入中找到“typeCode”,它也会在反序列化期间设置为true。这只是XmlSerializer 的一种行为,它会寻找这些模式。
  • 非常感谢。在再次阅读并使用我假设的代码之后。再次感谢你教会了我一些新东西! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-10
  • 1970-01-01
  • 2012-05-26
  • 1970-01-01
  • 1970-01-01
  • 2020-11-19
相关资源
最近更新 更多