无法在C#

我有以下课程:

public partial class ct_ServiceProductInfoWireless {

    private object[] itemsField;
    private bool directFulfillmentField;

    /// <remarks/>
    [system.xml.Serialization.XmlElementAttribute("NewWirelessLines",typeof(ct_WirelessLines))]
    [system.xml.Serialization.XmlElementAttribute("WirelessLine",typeof(ct_ServiceProductInfoWirelessWirelessLine))]
    public object[] Items {
        get {
            return this.itemsField;
        }
        set {
            this.itemsField = value;
        }
    }
}

ct_WirelessLines

public partial class ct_WirelessLines {

    private ct_NewWirelessLine[] wirelessLineField;

    /// <remarks/>
    [system.xml.Serialization.XmlElementAttribute("WirelessLine")]
    public ct_NewWirelessLine[] WirelessLine {
        get {
            return this.wirelessLineField;
        }
        set {
            this.wirelessLineField = value;
        }
    }
}

问题是当我序列化ct_ServiceProductInfoWireless对象时,出现以下异常:

  

在这种情况下,不能使用ct_WirelessLines []类型。

这是序列化代码:

var stringWriter = new System.IO.StringWriter();
var serializer = new XmlSerializer(objectToSerialize.GetType());
serializer.Serialize(stringWriter,objectToSerialize); //Getting exception here
return stringWriter.ToString();

怎么了?

ct_NewWirelessLine类

public partial class ct_NewWirelessLine {

    private ct_NewRatePlan ratePlanField;

    private ct_DataPlan dataPlanField;

    private ct_OrderDevice deviceField;

    private ct_PhoneNumber telephoneNumberField;

    private string lineNumberField;

    private bool isPrimaryLineField;
}

ct_ServiceProductInfoWirelessWirelessLine类

public partial class ct_ServiceProductInfoWirelessWirelessLine {

    private ct_Device deviceField;

    private ct_RatePlan ratePlanField;

    private ct_InstallmentPlan installmentPlanField;

    private string paymentArrangementField;

    private ct_OptionalFeature[] optionalPackagesField;

    private ct_WirelessFeature[] optionalFeaturesField;

    private string lineNumberField;

    private string primarySQNumberField;

    private string secondarySQNumberField;

    private st_CustomerType customerTypeField;

    private bool customerTypeFieldSpecified;

    private string ppuZipField;

    private string wtnField;

    private bool directFulfillmentField;

    private bool directFulfillmentFieldSpecified;
}
xiaojiankunzhuxi 回答:无法在C#

我能够重现错误消息

  
System.InvalidOperationException: The type ct_WirelessLines[] may not be used in this context.

通过将ct_ServiceProductInfoWireless.Items分配为ct_WirelessLines数组而不是一维数组:

Items = new [] { new [] { new ct_WirelessLines() } }`

之所以编译该代码是因为Items只是一个对象数组,而不会序列化,因为XmlSerializer期望XmlElementAttribute.Type属性中声明的两种类型的对象都在数组中,而不是一些嵌套数组。演示小提琴#1 here

解决方案是不这样做,而使用平面一维数组:

Items = new [] { new ct_WirelessLines() },

演示小提琴#2 here

如果您有两个集合,其中一个ct_WirelessLines和一个ct_ServiceProductInfoWirelessWirelessLine,则可以通过将集合内容上载到Items来将它们组合到最终的object数组中,然后使用Concat()ToArray()

var wirelessLines = GetWirelessLines(); // Some IEnumerable<ct_WirelessLines>
var productInfo = GetProductInfoWirelessWirelessLines(); // Some IEnumerable<ct_ServiceProductInfoWirelessWirelessLine>

var objectToSerialize = new ct_ServiceProductInfoWireless
{
    Items = wirelessLines.Cast<object>().Concat(productInfo).ToArray(),};

演示小提琴#3 here

顺便说一句,该代码似乎由xsd.exe自动生成。该工具通常不会自动为选择元素序列生成类层次结构。但是,如果可以手动修改生成的代码,则可以为Items引入一个抽象基类,以防止在编译时遇到这种错误:

public partial class ct_ServiceProductInfoWireless 
{
    private WirelessItemBase[] itemsField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("NewWirelessLines",typeof(ct_WirelessLines))]
    [System.Xml.Serialization.XmlElementAttribute("WirelessLine",typeof(ct_ServiceProductInfoWirelessWirelessLine))]
    public WirelessItemBase[] Items {
        get {
            return this.itemsField;
        }
        set {
            this.itemsField = value;
        }
    }
}

public abstract class WirelessItemBase
{
}

public partial class ct_WirelessLines : WirelessItemBase
{
}

public partial class ct_ServiceProductInfoWirelessWirelessLine : WirelessItemBase
{
}

现在以下代码甚至无法编译:

Items = new [] { new [] { new ct_WirelessLines() } },//Compilation error (line 72,col 13): Cannot implicitly convert type 'ct_WirelessLines[][]' to 'WirelessItemBase[]'

演示小提琴#4 here

本文链接:https://www.f2er.com/2949782.html

大家都在问