Сериализация перечисления в атрибут XML - PullRequest
2 голосов
/ 06 октября 2011

Я генерирую> 100 классов из множества XSD для создания нашего приложения для тестирования для внутреннего тестирования.Я использую 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();

Iиметь перечисление (я добавил 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 иногда любит делать, но любая помощь будет признательна.

1 Ответ

4 голосов
/ 06 октября 2011

Нет проблем с перечислениями в .net / XML; проблема просто в том, что вы (или xsd) добавили элемент «typeCodeSpecified». Это шаблон , который используется для условного включения значений - в частности, для члена с именем "Foo" механизм проверяет либо свойство "FooSpecified", либо метод "ShouldSerializeFoo ()". Поскольку вы никогда не устанавливаете "typeCodeSpecified" в значение true, он возвращает значение false, и элемент будет опущен во время сериализации.

Если вы этого не хотите, удалите этого участника.

...