我有大量数据需要序列化为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文件并将其加载回应用程序。到目前为止,我已经对所有其他数据进行反序列化工作,但由于无法将数据序列化,因此我没有达到此设置。
感谢您阅读本文。如果您需要更多信息,请与我们联系。
答案 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序列化。