首页 > 解决方案 > WebApi 到 XML 默认访问器的序列化错误

问题描述

我正在尝试从 WCF 服务做一个 web api,并且多个帖子都正常工作,但是对于特定的一个我有麻烦。这是来自 API 的代码:

[HttpPost]
[DeflateCompression]
[ActionName("Sell")]
public OTA_HotelResNotifRS Sell([FromBody]OTA_HotelResNotifRQ OTA_HotelResNotifRQ)
{
    ClientProviderHotel client = new ClientProviderHotel();
    return client.Hotel_Sell(OTA_HotelResNotifRQ);
}

这是来自 Hotel_Sell 方法的代码:

public OTA_HotelResNotifRS Hotel_Sell(OTA_HotelResNotifRQ Value)
{
    var objBRE = new Engine();


    string MarketCode;


    Timerwatch timerHotel_Sell = new Timerwatch("Hotel_Sell", "");
    timerHotel_Sell.Start();
    ExternalValues External = new ExternalValues();

    XDocument ValueDocument = XDocument.Parse(Serializer.SerializeToString<OTA_HotelResNotifRQ>(Value));

在此刻:

    XDocument ValueDocument = XDocument.Parse(Serializer.SerializeToString<OTA_HotelResNotifRQ>(Value));

我调用以下方法将对象序列化为 XML 字符串:

/// <summary>
/// Serialize Data to XML
/// </summary>
/// <typeparam name="T"> object Base</typeparam>
/// <param name="Value"> Object</param>
/// <returns>Data convert to XML</returns>
public static String SerializeToString<T>(T Value) 
    where T : class
{
   XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
   StringWriter stringWriter = new StringWriter();
   xmlSerializer.Serialize(stringWriter, Value);

   return stringWriter.ToString();
}

但是有以下错误:

System.InvalidOperationException:“生成 XML 文档时出错。”

InvalidOperationException:您必须在 Newtonsoft.Json.Linq.JObject 中实现默认访问器,因为它继承自 ICollection。

如果我使用 WCF 执行该过程,则不会出现错误。

对象描述如下:

    /// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://www.opentravel.org/OTA/2003/05")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://www.opentravel.org/OTA/2003/05", IsNullable = false)]
public partial class OTA_HotelResNotifRQ
{

    private SourceType[] pOSField;

    private UniqueID_Type messageIDField;

    private HotelReservationsType hotelReservationsField;

    private string echoTokenField;

    private System.DateTime timeStampField;

    private bool timeStampFieldSpecified;

    private OTA_AirAvailRQTarget targetField;

    private bool targetFieldSpecified;

    private string targetNameField;

    private decimal versionField;

    private string transactionIdentifierField;

    private string sequenceNmbrField;

    private OTA_AirAvailRQTransactionStatusCode transactionStatusCodeField;

    private bool transactionStatusCodeFieldSpecified;

    private string primaryLangIDField;

    private string altLangIDField;

    private bool retransmissionIndicatorField;

    private bool retransmissionIndicatorFieldSpecified;

    private string correlationIDField;

    private TransactionActionType resStatusField;

    private bool resStatusFieldSpecified;

    private string holdDurationField;

    /// <remarks/>
    [System.Xml.Serialization.XmlArrayItemAttribute("Source", IsNullable = false)]
    public SourceType[] POS
    {
        get
        {
            return this.pOSField;
        }
        set
        {
            this.pOSField = value;
        }
    }

    /// <remarks/>
    public UniqueID_Type MessageID
    {
        get
        {
            return this.messageIDField;
        }
        set
        {
            this.messageIDField = value;
        }
    }

    /// <remarks/>
    public HotelReservationsType HotelReservations
    {
        get
        {
            return this.hotelReservationsField;
        }
        set
        {
            this.hotelReservationsField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string EchoToken
    {
        get
        {
            return this.echoTokenField;
        }
        set
        {
            this.echoTokenField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public System.DateTime TimeStamp
    {
        get
        {
            return this.timeStampField;
        }
        set
        {
            this.timeStampField = value;
        }
    }

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

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public OTA_AirAvailRQTarget Target
    {
        get
        {
            return this.targetField;
        }
        set
        {
            this.targetField = value;
        }
    }

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

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string TargetName
    {
        get
        {
            return this.targetNameField;
        }
        set
        {
            this.targetNameField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public decimal Version
    {
        get
        {
            return this.versionField;
        }
        set
        {
            this.versionField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string TransactionIdentifier
    {
        get
        {
            return this.transactionIdentifierField;
        }
        set
        {
            this.transactionIdentifierField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute(DataType = "nonNegativeInteger")]
    public string SequenceNmbr
    {
        get
        {
            return this.sequenceNmbrField;
        }
        set
        {
            this.sequenceNmbrField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public OTA_AirAvailRQTransactionStatusCode TransactionStatusCode
    {
        get
        {
            return this.transactionStatusCodeField;
        }
        set
        {
            this.transactionStatusCodeField = value;
        }
    }

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

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute(DataType = "language")]
    public string PrimaryLangID
    {
        get
        {
            return this.primaryLangIDField;
        }
        set
        {
            this.primaryLangIDField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute(DataType = "language")]
    public string AltLangID
    {
        get
        {
            return this.altLangIDField;
        }
        set
        {
            this.altLangIDField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public bool RetransmissionIndicator
    {
        get
        {
            return this.retransmissionIndicatorField;
        }
        set
        {
            this.retransmissionIndicatorField = value;
        }
    }

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

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string CorrelationID
    {
        get
        {
            return this.correlationIDField;
        }
        set
        {
            this.correlationIDField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public TransactionActionType ResStatus
    {
        get
        {
            return this.resStatusField;
        }
        set
        {
            this.resStatusField = value;
        }
    }

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

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute(DataType = "duration")]
    public string HoldDuration
    {
        get
        {
            return this.holdDurationField;
        }
        set
        {
            this.holdDurationField = value;
        }
    }
}q

这个过程没有通过 JSON.Net 库进行显式序列化,当我发送 post 请求时,Json 仅在 Postman 中使用

标签: c#.netjsonasp.net-web-apiserialization

解决方案


推荐阅读