C#如何使用XmlSerializer序列化 ArrayList[]

rell336 2015-07-09 10:30:32
对C#理解不深,使用XmlSerializer序列化时,可以序列化ArrayList,但不能序列化ArrayList[ ]。各位大侠能否帮我想想办法,一个项目因此类型卡住的了?

代码如下:

private void button21_Click(object sender, EventArgs e)
{
ArrayList aList = new ArrayList();
aList.Add("aaa");
aList.Add("bbb");
// XMLSerializer.Serialize(aList, "ArrList.xml"); //序列化ArrayList 没问题的

ArrayList[] listarr = new ArrayList[2];
listarr[0] = new ArrayList();
listarr[1] = new ArrayList();
listarr[0].Add("1");
listarr[0].Add(2);
listarr[1].Add("111");
listarr[1].Add(22.55);

XMLSerializer.Serialize(listarr, "ArrListss.xml");
}



[Serializable]
public class XMLSerializer
{
public static void Serialize(System.Collections.ArrayList[] al,string filePath)
{
try
{
XmlSerializer formatter = new XmlSerializer(typeof(System.Collections.ArrayList[])); //此类型直接出错

//XmlSerializer formatter = new XmlSerializer(typeof(System.Collections.ArrayList));
StreamWriter sw = new StreamWriter(filePath, false);
//formatter.Serialize(sw, al[1]); //可以的
sw.Flush();
sw.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}


XmlSerializer formatter = new XmlSerializer(typeof(System.Collections.ArrayList[])); //此类型直接出错
...全文
772 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
rell336 2015-08-05
  • 打赏
  • 举报
回复
经过多次研究,把源代码的ArrayList[ ]改为ArrayList也不是一件非常麻烦的事情,我现在已经完成,并运行正常。就是把ArrayList[ ]中括号里面的index给去掉,本来是NitTable[0]和NitTable[1]数组2个,添加到ArrayList NitTables下面,2个子ArrayList数组table_nit (实际是根据设备不同而创建1~4个table_nit )。这样就能序列化了,不能就放弃。
宝_爸 2015-07-13
  • 打赏
  • 举报
回复
既然可以用ArrayList,那就用ArryList吧。 一下代码经过测试:

            ArrayList listarr = new ArrayList();

            ArrayList listsub1 = new ArrayList();
            listsub1.Add("1");
            listsub1.Add(2);


            ArrayList listsub2 = new ArrayList();
            listsub2.Add("111");
            listsub2.Add(22.55);

            listarr.Add(listsub1);
            listarr.Add(listsub2);

            XMLSerializer.Serialize(listarr, "ArrListss.xml");

    [Serializable]
    public class XMLSerializer
    {
        public static void Serialize(System.Collections.ArrayList al, string filePath)
        {
            try
            {
                Type typeInfo = al.GetType();
                XmlSerializer formatter = new XmlSerializer(typeInfo); //此类型直接出错

                //XmlSerializer formatter = new XmlSerializer(typeof(System.Collections.ArrayList));
                StreamWriter sw = new StreamWriter(filePath, false);
                formatter.Serialize(sw, al);
                sw.Flush();
                sw.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }
结果:

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfAnyType xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <anyType xsi:type="ArrayOfAnyType">
    <anyType xsi:type="xsd:string">1</anyType>
    <anyType xsi:type="xsd:int">2</anyType>
  </anyType>
  <anyType xsi:type="ArrayOfAnyType">
    <anyType xsi:type="xsd:string">111</anyType>
    <anyType xsi:type="xsd:double">22.55</anyType>
  </anyType>
</ArrayOfAnyType>
fontain2 2015-07-13
  • 打赏
  • 举报
回复
构造一个类实现 IEnumerable 或 ICollection接口就可以了,可以自己枚举,这部分还真得自己写代码,也并不难, foreach(ArrayList al in aList){ //将获得的al序列化为一个字符串,记住规则,将来可以按你的规则反序列化就可以 }
fontain2 2015-07-10
  • 打赏
  • 举报
回复
序列化是需要实现相关接口的,c#里面预定义的实现了,你定义的没实现,如果想序列化一是就如duanzi_peng所言,变通一下没什么,或者你自己写一个类实现相关接口,下面是该类的帮助文档描述 XmlSerializer 特殊处理实现 IEnumerable 或 ICollection 的类。 实现 IEnumerable 的类必须实现包含单个参数的公共 Add 方法。 Add 方法的参数的类型必须与从 Current 属性(此属性在从 GetEnumerator 返回的值上)返回的类型相同,或是该类型的基之一。 除了 IEnumerable 外,实现 ICollection(如 CollectionBase)的类还必须有一个包含整数的公共 Item 索引属性(在 C# 中为索引器),且必须有一个整数类型的公共 Count 属性。 Add 方法的参数类型必须与从 Item 属性返回的类型相同,或者为此类型的基之一。 对于实现 ICollection 的类,从具有索引的 Item 属性检索要序列化的值,而不是通过调用 GetEnumerator。 注意”特殊处理实现 IEnumerable 或 ICollection 的类“这句话
  • 打赏
  • 举报
回复
那你就 遍历 ArrayList[] 进行序列化。既然不接受 那个参数类型,就变通呗。
rell336 2015-07-10
  • 打赏
  • 举报
回复
序列化的目的当然是为了反序列化的哈! 楼上解释得很详细,谢谢,但我的确需要“授人以鱼”!!(基础太差的了)不过,遍历后,追加到文件的ArrayList是不能反序列化的啊?! 我所根据楼上的提示,想到的是用一个结构体,ArrayListSt,每个字段存ArrayList[ ]数组的ArrayList,比如ArrayListSt.a0=ArrayList[0],ArrayListSt.a1=ArrayList[1]来解决,序列化ArrayListSt后,反序列化ArrayListSt也能实现(已测试好)。 但,是否我这方法很愚笨?赋值可能很多次的? 因为实际上,ArrayList[ ]数组是嵌入在一个结构体中,其长度也不固定(那么我用我前面方法,就需要将此ArrayList[ ]数组提出来,嵌入到另外的ArrayListSt结构体中)?手动赋值,估计都又得弄半天的 各位,有其他好办法吗?

111,097

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧