【问题标题】:C# object to XML string and backC# 对象到 XML 字符串并返回
【发布时间】:2014-09-02 06:23:23
【问题描述】:

我正在使用一个应用程序,该应用程序允许用户使用地图、在其上追踪线并在他们想要的任何地方设置标记,但我需要将他们可能需要的任何类型的数据存储在标记的属性之一中(是 byte[] 类型,所以我可以将它作为 varbinary 存储在数据库中),但是当我尝试将其转换回原始类型时,我遇到了错误。

要存储的对象:

public ColeccionPoints listOfData = new ColeccionPoints();
//Of course the list to store won't be empty, this is only an example.

将列表存储在标记中

foreach (RouteMarkers r in pictureBox1.Controls.OfType<RouteMarkers>())
        {
            MappingMarkerMap m = new MappingMarkerMap();

//Using binaryFormatter and MemoryStream to save the object of ColeccionPoints to byte array
            BinaryFormatter bf = new BinaryFormatter();
            MemoryStream ms = new MemoryStream();
            bf.Serialize(ms, listOfData );

//Storing the object into MarkerData 
            m.MarkerData = ms.ToArray();


            m.MarkerDescription = r.Description;
            m.MarkerId = r.Id;
            m.MarkerType = (MappingMarkerMap.Type)r.Type;
            m.Number = r.Number;
            m.X = r.Location.X;
            m.Y = r.Location.Y;

            markers.Add(m);
        }

使用简单的 SQL 语句保存到数据库中,然后我传递存储在 varbinary(max) 列中的参数

cmd.Parameters.AddWithValue("MarkerData", marker.MarkerData);

当我需要检索数据并将其转换回原始类型时,问题就开始了。

我使用一个简单的 select*from 表来获取我需要的字段并将 varbinary 转换为字节

m.MarkerData = (byte[])dr["markerData"];

从这里我不知道如何将 MarkerData 字节数组转换为 CollectionPoints,我尝试反序列化:

BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
bf.Deserialize(ms, m.MarkerData);

但我得到下一个错误:错误 15 参数 2:无法从 'byte[]' 转换为 'System.Runtime.Remoting.Messaging.HeaderHandler'

对于将数据转换为 CollectionPoints 的任何帮助,我将不胜感激,如果我的英语不是很好,我深表歉意,我已尽力解释问题,希望清楚,如果没有,请告诉我。

提前致谢。

【问题讨论】:

  • 只是出于好奇,您是否尝试过使用DataContractSerializer 之类的东西?我已经用那个序列化器完成了这个,但不是BinaryFormatter
  • 为什么要将其作为二进制文件存储在数据库中,而不是创建适当的数据库架构?
  • 我还没有尝试过使用 DataContractSerializer,我想我可以阅读一下 :) 感谢您的建议,我也会检查一下。 mason:因为我需要存储的数据可能会改变,现在是 CollectionPoints 类,但我以后可能需要存储其他东西。

标签: c# arrays object serializable


【解决方案1】:

由于 BradleyDotNET 的评论让我阅读了有关 DataContractSerializer 和 XmlSerializer 的评论,我设法解决了这个问题 :)

我将属性 m.MarkerData 的类型从 byte[] 更改为字符串,而是使用 BinaryFormatter,使用 XmlSerializer。

using (StringWriter writer = new StringWriter(CultureInfo.InvariantCulture))
{
    XmlSerializer serializer = new XmlSerializer(typeof (Entities.Points));
    serializer.Serialize(writer, r.Datos);
    m.MarkerData = writer.ToString();
}

所以在将字符串保存在数据库中后,我只需通过反序列化来检索它:

XmlSerializer serializer = new XmlSerializer(typeof(Entities.Points));
using (StringReader reader = new StringReader(m.MarkerData))
{
    r.Datos = (Entities.Points)serializer.Deserialize(reader);
}

【讨论】:

  • 对了,Entities.Points 以前是 Entities.ColeccionPoints,我只是重命名了。
  • 您至少可以更改问题的标题,因为此答案无助于任何人转为C# object to byte array and back
猜你喜欢
  • 2016-06-10
  • 1970-01-01
  • 2014-07-30
  • 1970-01-01
  • 1970-01-01
  • 2013-08-04
  • 2014-08-27
  • 1970-01-01
  • 2013-02-23
相关资源
最近更新 更多