C#序列化 - 列出包含字符串的<object>和List <objects>

时间:2016-11-17 21:34:16

标签: c# xml serialization deserialization

我有大量数据需要序列化为XML文件。我没有问题让所有其他类序列化到他们自己的文件,除了这一个类。具体来说,我在下面评论过的List<lCLSIDs> _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; }
}

AND,以下是上述的子类:

[Serializable]
public class oCOMFiles
{
    public string Name { get; set; }
    public string Path { get; set; }
    public oCOMFiles() { }
    public oCOMFiles(string sName, string sPath)
    {
        this.Name = sName;
        this.Path = sPath;
    }
}

[Serializable]
public class oTypeLib
{
    public string Name { get; set; }
    public string GUID { get; set; }
    public string Version { get; set; }
    public string Description { get; set; }
    public string FileSize { get; set; }
    public string HelpString { get; set; }
    public int LCID { get; set; }
    public string ContainingFile { get; set; }
    public oTypeLib() { }
    public oTypeLib(string sName, string sGUID, string sVersion, string sDescription, string sFileSize, string sHelpString, int sLCID, string sContainingFile)
    {
        this.Name = sName;
        this.GUID = sGUID;
        this.Version = sVersion;
        this.Description = sDescription;
        this.FileSize = sFileSize;
        this.HelpString = sHelpString;
        this.LCID = sLCID;
        this.ContainingFile = sContainingFile;
    }
}

[Serializable]
public class lCLSIDs
{
    public string COMFileName;
    public List<oCLSIDs> oItems;
    public lCLSIDs() { }
    public lCLSIDs(string _COMFileName, List<oCLSIDs> _oItems)
    {
        this.COMFileName = _COMFileName;
        this.oItems = _oItems;
    }
}

[Serializable]
public class oCLSIDs
{
    public string ProgID { get; set; }
    public string GUID { get; set; }
    public string Version { get; set; }
    public Array AttributeArray { get; set; }
    public short AttributeStrings { get; set; }
    public oCLSIDs() { }
    public oCLSIDs(string sProgID, string sGUID, string sVersion, Array arrAttributeArray, short stAttributeStrings)
    {
        this.ProgID = sProgID;
        this.GUID = sGUID;
        this.Version = sVersion;
        this.AttributeArray = arrAttributeArray;
        this.AttributeStrings = stAttributeStrings;
    }
}

以下代码片段是我用于所有类的代码段。当我注释掉public List<lCLSIDs> _CLSIDs { get; set; }行时,它适用于所有这些,甚至是上面的那个。

Serialize_Classes.serCOMInfo oCOMInfo = frmCOMInfo.Instance.COMInfo_SaveForm();
File_Output.CreateXMLFile(oCOMInfo, PRCxGlobals.sCOMInfoFile);

最后,这是我的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 = new XmlSerializer(typeof(Serialize_Classes.serCOMInfo)); 那没用。

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

这是我发现的与此类似的两个问题: 1)C# Serialize an object with a list of objects in it 2)XML Serialize generic list of serializable objects

这两个都使用了我认为似乎不需要的标签。我所有的其他XML都是我想要的。你认为这是我应该尝试的吗?

我希望避免进行更多重大更改,因为收集这些数据涉及很多代码。我没有选择,所以我很好奇其他人认为我应该做的事情。

我还应该提到我必须反序列化XML文件并将其加载回应用程序。到目前为止,我已经对所有其他数据进行反序列化工作,但由于无法将数据序列化,因此我没有达到此设置。

感谢您阅读本文。如果您需要更多信息,请与我们联系。

2 个答案:

答案 0 :(得分:0)

问题在于:

public Array AttributeArray { get; set; }

Serializer不知道如何序列化和反序列化通用Array类型。您的异常有一个内部异常,即

  

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

泛型Array类不能直接在C#中使用。改为使用类型化数组,例如

public string[] AttributeArray { get; set; }

答案 1 :(得分:0)

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