BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / dot-net / #3419同步于 2011/10/28
该镜像源已超过 30 天没有更新,可能在源站已被删除。
dotNET机器人发帖

请教如何将ArrayList类的实例用XML的serialize方法存入xml文件

fninerest
2011/10/28镜像同步5 回复
各位老师,我遇到一个问题。我要把一个ArrayList类存入xml文件,ArrayList内的元素是一个自定的类skeletonData。 这个类的定义如下: public class skeletonData { public string name { get; set; } //private bool isSystem; public ArrayList rightPositionArray;//用于存放joint数据 public ArrayList leftPositionArray; public bool flag; public int level; public int correspond; } 然后我编了一个用来做存储和读取操作的类 代码如下: public class kinect_database { public ArrayList skeletonArrayPresent; public skeletonData skeletonPresent; public kinect_database()//构造函数 { skeletonArrayPresent = new ArrayList(); skeletonPresent = new skeletonData(); } public ArrayList read()//从文件读取所有动作,返回包含所有动作的arraylist. { System.Xml.Serialization.XmlSerializer reader = new System.Xml.Serialization.XmlSerializer(typeof(ArrayList)); System.IO.StreamReader file = new System.IO.StreamReader(@"c:\temp\SerializationOverview.xml"); skeletonArrayPresent = (ArrayList)reader.Deserialize(file); file.Close(); return skeletonArrayPresent; } public bool save()//将当前SkeletonArray保存至文件。 { skeletonArrayPresent.Add(skeletonPresent); System.Xml.Serialization.XmlSerializer writer = new System.Xml.Serialization.XmlSerializer(typeof(ArrayList)); System.IO.StreamWriter file = new System.IO.StreamWriter(@"c:\temp\SerializationOverview.xml"); writer.Serialize(file, skeletonArrayPresent); file.Close(); return true; } } 下面是控制台程序的main方法: class Program { static void Main(string[] args) { kinect_database ki = new kinect_database(); skeletonData skele1 = new skeletonData(); ArrayList d = new ArrayList(); ki.skeletonPresent.name = "test";//将ki实例中的skeletonPresent中的name设一个值 ki.save();//存储 ki.read();//读取 skele1 = ki.skeletonArrayPresent[0]; Console.WriteLine("值:{0}",skele1.name); } } 出错提示是: Unhandled Exception: System.InvalidOperationException: There was an error genera ting the XML document. ---> System.InvalidOperationException: The type ConsoleAp plication1.skeletonData was not expected. Use the XmlInclude or SoapInclude attr ibute to specify types that are not known statically. at System.Xml.Serialization.XmlSerializationWriter.WriteTypedPrimitive(String name, String ns, Object o, Boolean xsiType) at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterArrayL ist.Write1_Object(String n, String ns, Object o, Boolean isNullable, Boolean nee dType) at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterArrayL ist.Write2_ArrayOfAnyType(Object o) --- End of inner exception stack trace --- at System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Obje ct o, XmlSerializerNamespaces namespaces, String encodingStyle, String id) at System.Xml.Serialization.XmlSerializer.Serialize(TextWriter textWriter, Ob ject o, XmlSerializerNamespaces namespaces) at System.Xml.Serialization.XmlSerializer.Serialize(TextWriter textWriter, Ob ject o) at ConsoleApplication1.kinect_database.save() in C:\Documents and Settings\Ad ministrator\my documents\visual studio 2010\Projects\ConsoleApplication1\Console Application1\Program.cs:line 62 at ConsoleApplication1.Program.Main(String[] args) in C:\Documents and Settin gs\Administrator\my documents\visual studio 2010\Projects\ConsoleApplication1\Co nsoleApplication1\Program.cs:line 159 请按任意键继续. . . 上面提示中的62行是save()方法中的writer.Serialize(file, skeletonArrayPresent);行。 159行是main方法中的 “ki.save();//存储” 行。 但是将save()方法中xml要序列化的类型改为skeletonData,即: public bool save()//将当前SkeletonArray保存至文件。 { System.Xml.Serialization.XmlSerializer writer = new System.Xml.Serialization.XmlSerializer(typeof(skeletonData));//这里修改了 System.IO.StreamWriter file = new System.IO.StreamWriter(@"c:\temp\SerializationOverview.xml"); writer.Serialize(file, skeletonPresent);//这里修改了 file.Close(); return true; } 就是不存ArrayList类型 而存自定义的skeletonData类型的话,一切正常。 我的问题是 是不是XML的序列化不能存储ArrayList类?如果不能存储ArrayList类的话,用什么方法可以把ArrayList类存入一个文件,并且读出的时候可以直接读出? 谢谢各位了 如果还有没说清楚的我接着描述清楚的 附上源文件 附件(2.6KB) Program.cs
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
wangjianzhou机器人#1 · 2011/10/28
将ArrayList改用为泛型List<T>
Kazuki机器人#2 · 2011/10/28
一般我是这么做: <Xml.Serialization.XmlRoot()> Public Class A '内部存储用ArrayList(其实建议用List(Of T)),序列化时忽略 <Xml.Serialization.XmlIgnore()> Private _AL As New ArrayList '序列化时将ArrayList转换为数组,反序列化时将数组每个元素存入ArrayList <Xml.Serialization.XmlElement()> Public Property AL As B() Get Return _AL.ToArray() End Get Set(ByVal value As B()) For Each v As B In value _AL.Add(v) Next End Set End Property End Class Public Class B End Class 最终存的文件会是: <A> <B /> <B /> <B /> ......... <B /> </A>
fninerest机器人#3 · 2011/10/28
感谢楼上老师帮忙!!!
ahomer机器人#4 · 2011/10/28
上面是湿胸,不是老湿吧 [em20]
Kazuki机器人#5 · 2011/10/28
人家才木有湿呢 【 在 ahomer 的大作中提到: 】 : 上面是湿胸,不是老湿吧 [em20]