尝试将对象序列化为XML

时间:2012-05-07 12:46:03

标签: c# silverlight windows-phone-7 xml-serialization

使用WP7& C#:

我试图将我的对象转换为XML,然后我可以将该文件保存到SkyDrive。我尝试过很多没有太多运气的例子。使用此代码我

 public void ConvertObjectToXmlString()
        {
            System.IO.MemoryStream ms = new System.IO.MemoryStream();
            System.Xml.Serialization.XmlSerializer xs = new System.Xml.Serialization.XmlSerializer(App.ViewModel.vehicleItemsCollection.GetType());
            System.Xml.XmlWriter xtw = System.Xml.XmlWriter.Create(ms);
            //System.Xml.XmlTextWriter xtw = new System.Xml.XmlTextWriter(ms, System.Text.Encoding.UTF8);

            xs.Serialize(xtw, App.ViewModel.vehicleItemsCollection[0]);

            MessageBox.Show(xtw.ToString());
        }

错误在这一行:xs.Serialize(xtw, App.ViewModel.vehicleItemsCollection[0]); 我有一个集合,在我的测试中只有一个项目。但是我可以想象,当我最终发布这个代码时,我不会设置索引[0]。

错误说明: 生成XML文档时出错

当我进一步查看错误消息时,我看到以下内容: 无法将类型为OilChangeApplication.vehicle的对象分配给System.Collections.ObjectModel.ObservableCollection`1 [[OilChangeApplication.vehicle,OilChangeApplication,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]]类型的对象。 /强>

vehicleItemsCollection是一个车辆的集合......我需要做些什么来获取一些XML,以便我可以上传它?

2 个答案:

答案 0 :(得分:3)

我的猜测是你序列化集合的项目。要序列化所有集合,您需要传递它:

xs.Serialize(xtw, App.ViewModel.vehicleItemsCollection);

澄清。通过这个:

XmlSerializer(App.ViewModel.vehicleItemsCollection.GetType());

您指定序列化程序可以序列化类型为

的对象
ObservableCollection<OilChangeApplication.vehicle>

您传递给序列化OilChangeApplication.vehicle的实例而不是OilChangeApplication.vehicle个实例的集合。


如果您只想序列化一个对象,那么您需要“告诉”序列化程序您将序列化OilChangeApplication.vehicle

XmlSerializer(typeof(OilChangeApplication.vehicle));

现在您只能序列化一个对象:

xs.Serialize(xtw, App.ViewModel.vehicleItemsCollection[0]);

答案 1 :(得分:3)

错误似乎非常明确,编译器的轻微翻译说: 无法将OilChangeApplication.vehicle类型的对象分配给ObservableCollection<OilChangeApplication.vehicle>类型的对象。

这意味着您对集合的索引会导致错误,此处:

xs.Serialize(xtw, App.ViewModel.vehicleItemsCollection[0]);

因为您告诉上面的序列化程序ObservableCollection<...>而不是传递new XmlSerializer(App.ViewModel.vehicleItemsCollection.GetType());,而是传递模型类的实例。

因此,您可以只删除[0]或更改传递给序列化程序的类型,错误就会消失。

xs.Serialize(xtw, App.ViewModel.vehicleItemsCollection);

 var xs = new System.Xml.Serialization.XmlSerializer(OilChangeApplication.vehicle.GetType());