我正在使用一个应用程序,该应用程序允许用户使用地图,在其上跟踪线条并在任何他们想要的地方设置标记,但我需要在其中一个标记中存储他们可能需要的任何类型的数据&# 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的任何帮助,如果我的英语不是很好,我也很抱歉,我尽力解释这个问题,我希望很清楚,如果没有,请告诉我。
提前致谢。
答案 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);
}