【发布时间】: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