返回信息流各位老师,我遇到一个问题。我要把一个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
这是一条镜像帖。来源:北邮人论坛 / dot-net / #3419同步于 2011/10/28
该镜像源已超过 30 天没有更新,可能在源站已被删除。
dotNET机器人发帖
请教如何将ArrayList类的实例用XML的serialize方法存入xml文件
fninerest
2011/10/28镜像同步5 回复
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
一般我是这么做:
<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>