C#对象到XML字符串并返回

时间:2014-07-11 15:06:47

标签: c# arrays object serializable

我正在使用一个应用程序,该应用程序允许用户使用地图,在其上跟踪线条并在任何他们想要的地方设置标记,但我需要在其中一个标记中存储他们可能需要的任何类型的数据&# 39; s属性(这是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 table来获取我需要的字段并将varbinary转换为byte

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

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

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

但是我得到了下一个错误:错误15参数2:无法转换为&#39; byte []&#39;到&#39; System.Runtime.Remoting.Messaging.HeaderHandler&#39;

我很感激将数据转换为CollectionPoints的任何帮助,如果我的英语不是很好,我也很抱歉,我尽力解释这个问题,我希望很清楚,如果没有,请告诉我。

提前致谢。

1 个答案:

答案 0 :(得分:-1)

由于BradleyDotNET的评论使我了解了DataContractSerializer,然后了解了XmlSerializer,我设法解决了这个问题:)

我将属性m.MarkerData的类型从byte []更改为string,而是使用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);
}