【问题标题】:Custom data-type not serialized to XML未序列化为 XML 的自定义数据类型
【发布时间】:2015-09-10 12:21:32
【问题描述】:

在 VS2012(C#,.Net 4.5)中,我通过从解决方案资源管理器添加服务引用来使用第三方 WebService(附加了自动生成的 Reference.cs 文件的内容)。

当我调用 WebService 的方法来插入此类的对象时,第一个字段被正确序列化为 XML,因为第二个字段(自定义)被忽略了。

但是,当我调用另一个方法来查询这个类的对象时(之前使用soapUI插入,它告诉我WebService运行正常),我可以正确接收和处理这两个字段(这意味着反序列化过程很好执行,我认为)。

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.34209")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://es/mynamespace")]
public partial class AccidenteRequest : object, System.ComponentModel.INotifyPropertyChanged {

    private string descripcionField;       
    private AccidenteRequestSalida_via salida_viaField;

    [System.Xml.Serialization.XmlElementAttribute(Order=0)]
    public string descripcion {
        get {
            return this.descripcionField;
        }
        set {
            this.descripcionField = value;
            this.RaisePropertyChanged("descripcion");
        }
    }

    [System.Xml.Serialization.XmlElementAttribute(Order = 1)]
    public AccidenteRequestSalida_via salida_via {
        get {
            return this.salida_viaField;
        }
        set {
            this.salida_viaField = value;
            this.RaisePropertyChanged("salida_via");
        }
    }
}

[System.Xml.Serialization.XmlIgnoreAttribute()]
    public bool salida_viaSpecified {
        get {
            return this.salida_viaFieldSpecified;
        }
        set {
            this.salida_viaFieldSpecified = value;
            this.RaisePropertyChanged("salida_viaSpecified");
        }
    }

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.34209")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://es/mynamespace")]
public enum AccidenteRequestSalida_via {
    [System.Xml.Serialization.XmlEnumAttribute("0")]
    Item0,

    /// <comentarios/>
    [System.Xml.Serialization.XmlEnumAttribute("1")]
    Item1,
}

在 XSD 文件中,这些字段是:

<xs:element minOccurs="0" name="descripcion">
    <xs:simpleType>
        <xs:restriction base="xs:string">
            <xs:maxLength value="2000" />
        </xs:restriction>
    </xs:simpleType>
</xs:element>
<xs:element minOccurs="0" name="salida_via">
    <xs:simpleType>
        <xs:restriction base="xs:integer">
            <xs:enumeration value="0" />
            <xs:enumeration value="1" />
        </xs:restriction>
    </xs:simpleType>
</xs:element>

我以这种方式为字段赋值:

accidente.salida_via = AccidenteRequestSalida_via.Item1;

但我在发送到 WebService 的最终 XML 中看不到该值。

鉴于此: 更新:默认情况下,C# 似乎从 0 开始枚举。可以执行以下操作: accidente.circula_sentido_contrario = (AccidenteRequestCircula_sentido_contrario)VALUE_FROM_DB

VALUE_FROM_DB 来自数据库,我需要它与 XmlEnumAttribute 中的字符串具有相同的值。现在我要赋值0,然后翻译成Item1,但是我需要赋值1。

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.34209")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="somenamespace")]
public enum AccidenteRequestCircula_sentido_contrario {

    /// <comentarios/>
    [System.Xml.Serialization.XmlEnumAttribute("1")]
    Item1,
}

任何帮助将不胜感激。

【问题讨论】:

  • 使用什么序列化器?
  • @AlexanderPetrov - 基于发布的代码 XmlSerializer。
  • @Tim - 是的,基于它应该是 XmlSerializer,但谁知道作者使用什么。
  • @AlexanderPetrov 我认为它是 XmlSerializer。如何在序列化中包含第二个(自定义)字段?
  • 是否也有一个accidentale.salida_viaSpecified 属性?

标签: c# xml web-services wcf serialization


【解决方案1】:

您需要将相关的Specified 字段设置为true。

accidente.salida_via = AccidenteRequestSalida_via.Item1;
accidente.salida_viaSpecified = true;

解释可以在这里找到https://stackoverflow.com/a/30604168/569662

【讨论】:

  • 谢谢!奇迹般有效! :D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-05
  • 2013-09-11
  • 2010-12-03
相关资源
最近更新 更多