C#序列化-列表<;对象>;包含字符串和列表的<;对象>;

C#序列化-列表<;对象>;包含字符串和列表的<;对象>;,c#,xml,serialization,deserialization,C#,Xml,Serialization,Deserialization,我有大量数据需要序列化为XML文件。我可以让我的所有其他类序列化为它们自己的文件,除了这个类。特别是我在下面注释掉的List\u CLSIDs子类。这个类的其余部分序列化得很好 这就是我试图序列化的类 [Serializable] public class serCOMInfo { public List<oCOMFiles> ListOfCOMFiles { get; set; } public SerializableDictionary<string, o

我有大量数据需要序列化为XML文件。我可以让我的所有其他类序列化为它们自己的文件,除了这个类。特别是我在下面注释掉的
List\u CLSIDs
子类。这个类的其余部分序列化得很好

这就是我试图序列化的类

[Serializable]
public class serCOMInfo
{
    public List<oCOMFiles> ListOfCOMFiles { get; set; }
    public SerializableDictionary<string, oTypeLib> _TypeLib { get; set; }
    //public List<lCLSIDs> _CLSIDs { get; set; }
    public List<string> COMErrors { get; set; }
}
最后,这里是我的CreateXMLFile代码:

private static Stream fstream;
public static bool CreateXMLFile(object oFormData, string sFileName)
{
    string sSaveFile = Path.Combine(sZipDirForXMLs, sFileName);
    SaveFileDialog sfdl = new SaveFileDialog();
    sfdl.FileName = sSaveFile;
    try
    {
        fstream = sfdl.OpenFile();
        XmlSerializer ser = new XmlSerializer(oFormData.GetType());
        using (StreamWriter wr = new StreamWriter(fstream))
        {
            ser.Serialize(wr, oFormData);
        }
        fstream.Close();
        return true;
    }
    catch (Exception ex)
    {
        fstream.Close();
        Logger.Global.Error("Unable to open file: " + ex.Message);
        return false;
    }
}
以下是我运行程序时遇到的错误: 错误:“反映类型“PCRx.Net.Modules.Serialize_Classes.serCOMInfo”的错误。”

这个错误使我认为该类型处理得不够好,因此我尝试仅为这一组数据更改XmlSerializer行:
XmlSerializer ser=新的XmlSerializer(typeof(Serialize_Classes.serCOMInfo))
那没用

我已经做了几天了,最初,这门课是一本字典。我将它切换为包含对象列表的对象列表,因为我认为问题出在SeralizableDictionary上。我错了。序列化不包含一个或多个对象的对象列表没有问题。仅此特定数据集是包含另一个对象列表的对象列表。我现在认为它与在对象列表中有另一个对象列表有关。不确定,但那是我的想法

这是我发现的唯一两个与此类似的问题: 1) (二)

这两个都使用了我似乎不需要的标签。我所有其他的XML都是我想要的方式。你觉得我应该试试吗

我希望避免进行更大的更改,因为收集这些数据涉及到很多代码。不过我别无选择,所以我很好奇其他人认为我应该在这里做什么

我还应该提到,我必须反序列化XML文件并将其加载回应用程序。到目前为止,我已经对所有其他数据进行了反序列化,但是我还没有对这个集合进行反序列化,因为我无法对数据进行序列化

[Serializable]
public class serCOMInfo
{
    public List<oCOMFiles> ListOfCOMFiles { get; set; }
    public SerializableDictionary<string, oTypeLib> _TypeLib { get; set; }
    //public List<lCLSIDs> _CLSIDs { get; set; }
    public List<string> COMErrors { get; set; }
}
谢谢你阅读这篇文章。如果您需要更多信息,请告诉我。

问题在于:

public Array AttributeArray { get; set; }
序列化程序不知道如何序列化和取消序列化泛型数组类型。您的异常有一个内部异常,它表示

InvalidOperationException:必须在System.Array上实现默认访问器,因为它继承自ICollection

泛型数组类不打算直接在C#中使用。例如,使用类型化数组

public string[] AttributeArray { get; set; }
问题在于:

public Array AttributeArray { get; set; }
序列化程序不知道如何序列化和取消序列化泛型数组类型。您的异常有一个内部异常,它表示

InvalidOperationException:必须在System.Array上实现默认访问器,因为它继承自ICollection

泛型数组类不打算直接在C#中使用。例如,使用类型化数组

public string[] AttributeArray { get; set; }

如果您希望属性AttributeArray具有多个类型,那么XML序列化将无法工作。 正如@NineBerry所提到的,您需要数组的实际类型。
那么使用JSON序列化可能更好。

如果您希望属性AttributeArray具有多个类型,那么XML序列化将无法工作。 正如@NineBerry所提到的,您需要数组的实际类型。
那么,使用JSON序列化可能更好。

您得到的异常的内部异常是什么?您得到的异常的内部异常是什么?哇,您很快就发现了问题。我把它转换成一个字符串数组,它可以工作。非常感谢你,尼尼贝里。如果这个答案对你有用,请把它标记为答案。哇,你这么快就发现了问题。我把它转换成一个字符串数组,它可以工作。非常感谢你,尼尼贝里。如果这个答案对你有用,请将其标记为答案。如果事先知道数组中可以包含哪些类,则可以序列化包含不同类的对象的数组,并使用
XmlArrayItem
属性指定每个类。如果事先知道哪些类,则可以序列化包含不同类的对象的数组类可以包含在数组中,并使用
XmlArrayItem
属性指定每个类。