代码之家  ›  专栏  ›  技术社区  ›  Luca

XML序列化程序,“指定”后缀和IReflect

  •  6
  • Luca  · 技术社区  · 15 年前

    我发现如果 字段/属性 具有类型为的相应字段 布尔值 字段/属性 带有“指定”后缀的名称,xmlserializer有条件地排除 字段/属性 来自序列化进程。好极了!

    所以,我想避免这些字段的定义,并在运行时动态添加它们…

    阅读 this ,我发现了一个有趣的界面 IReflect ,我可以使用它“模拟”XML序列化程序实例用于排除某些字段的动态字段。

    这行吗?

    3 回复  |  直到 7 年前
        1
  •  2
  •   Community Mohan Dere    9 年前

    如果您想控制XML序列化,那么有两个选项。第一个(这里可能不合适)使用system.xml.serialization命名空间中的属性排除属性。如果您真的需要确定什么在运行时被序列化,这可能不是最佳的操作过程。

    Attributes That Control XML Serialization

    另一种方法是在类上实现IXML可序列化接口,并实现readXML和writeXML方法。这允许您精确地控制XML的外观。有关更多信息,请参阅此问题:

    custom xml serialization

    但是,正如这里提到的 Mixing custom and basic serialization? 一旦实现了IXML可序列化,您就要负责类型的所有序列化逻辑。

        2
  •  2
  •   OutLaw    10 年前

    我会延长 马丁·派克 。 可以避免使用“指定”后缀对字段/属性进行序列化。 您应该在类中定义“*指定”属性并应用 [XmlIgnoreAttribute()] 对他们来说。

    下面是一个例子:

    [System.SerializableAttribute()]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://yournamespace.com")]
    public partial class YourObject
    {
        private long sessionTimeoutInSecondsField;
    
        private bool sessionTimeoutInSecondsFieldSpecified;
    
        public long sessionTimeoutInSeconds
        {
            get
            {
                return this.sessionTimeoutInSecondsField;
            }
            set
            {
                this.sessionTimeoutInSecondsField = value;
            }
        }
    
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool sessionTimeoutInSecondsSpecified
        {
            get
            {
                return this.sessionTimeoutInSecondsFieldSpecified;
            }
            set
            {
                this.sessionTimeoutInSecondsFieldSpecified = value;
            }
        }
    }
    
        3
  •  0
  •   kdaShivantha    7 年前

    代码示例作为所提供答案的扩展;

    WSDL:

    <xs:simpleType name="vehicleType">
        <xs:restriction base="xs:string">
          <xs:enumeration value="CAR" />
          <xs:enumeration value="BUS" />
          <xs:enumeration value="BIKE" />
        </xs:restriction>
      </xs:simpleType>
    <xs:complexType name="advancedSearchRequest">
        <xs:sequence>
          <xs:element minOccurs="0" name="vehicleType" type="tns:vehicleType" />
          <xs:element name="search" type="xs:string" />
        </xs:sequence>
      </xs:complexType>
    

    生成的.NET SOAP客户端类

    System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.7.3056.0")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="your namespace")]
    public partial class advancedSearchRequest : object, System.ComponentModel.INotifyPropertyChanged {
    
        private vehicleType vehicleTypeField;
    
        private bool vehicleTypeFieldSpecified;
    
        private string searchField;
    
    
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=0)]
        public vehicleType vehicleType {
            get {
                return this.vehicleTypeField;
            }
            set {
                this.vehicleTypeField = value;
                this.RaisePropertyChanged("vehicleType");
            }
        }
    
        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool vehicleTypeSpecified {
            get {
                return this.vehicleTypeFieldSpecified;
            }
            set {
                this.vehicleTypeFieldSpecified = value;
                this.RaisePropertyChanged("vehicleTypeSpecified");
            }
        }
    
        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=3)]
        public string search {
            get {
                return this.searchField;
            }
            set {
                this.searchField = value;
                this.RaisePropertyChanged("search");
            }
        }
    
    }
    

    您可以将“vehicletypeFieldSpecified”=真/假设置为序列化/省略;

    advancedSearchRequest.vehicleTypeField = vehicleType.BIKE;
    advancedSearchRequest.vehicleTypeFieldSpecified = true;
    

    产生的SOAP消息;

    <advancedSearchRequests>
     <vehicleType>BIKE</vehicleType>
     <search>abc</search>
    </advancedSearchRequest>