【问题标题】:how to convert byte[] to an ArrayList of Hashtables?如何将 byte[] 转换为 Hashtables 的 ArrayList?
【发布时间】:2009-09-17 06:54:29
【问题描述】:

有人可以给我一个例子,说明如何使用 C# 将 byte[] 转换为 Hashtables 的 ArrayList 吗? (byte[]代表之前序列化的Hashtables的ArrayList)

注意:我在不提供 BinaryFormatter 的 Windows Mobile 下运行。

【问题讨论】:

标签: c# arrays byte


【解决方案1】:

另外,我的 ArrayList 会被数据库 API 自动转换为 byte[]

坦率地说,您将必须找到用于有机会重建此数据的实际序列化 API。它可能是BinaryFormatter,它是出了名的不可移植和版本不兼容。

如果您需要将数据存储为二进制文件,并在长期(数据库)和平台(CF)之间使用它,那么您将不得不使用合适的序列化程序。例如,protobuf-net 可以在主体中工作(尽管它不喜欢无类型的ArrayList,更喜欢有类型的List<T> 等)。

如果数据当前存储为BinaryFormatter,那么最好的办法是使用当前系统将其提取并重新打包(可能在不同的列或表中)更合适的序列化格式。

【讨论】:

  • 我目前正在使用 SQLite。我还没有找到任何控制对象序列化方式的方法,所以我不确定是否可以使用不同的序列化/反序列化工具。你有这方面的经验吗?
  • 不直接使用 SQLite;但是你能给它一个预处理的byte[]吗?
  • 我尝试了以下方法: List myList = new List(); myList.add(new Dummy());流目的地 = new MemoryStream(); ProtoBuf.Serializer.Serialize(destination, myList);我收到 TypeLoadException:“只能处理数据合同类(以及此类列表/数组)(错误处理 List`1)”。我在code.google.com/p/protobuf-net/issues/detail?id=58 阅读了一些解释,但还不能应付。有什么想法吗?
  • protobuf-net 需要确信它理解你想要什么。例如,您可以将[ProtoContract] 添加到类型中,并将[ProtoMember(1)][ProtoMember(2)] 等添加到属性中。还有其他方法可以做到这一点,但这是在评论中解释最简单的方法!
  • 非常感谢!一切都像魅力一样!不过,他们应该提供一些文档/示例@protobuf-net。再次感谢您!
【解决方案2】:

当您说“之前已序列化”时,您的意思是“使用BinaryFormatter 序列化”吗?如果是这样,不 - 您也需要 BinaryFormatter 反序列化。如果 Compact Framework 不支持这一点,那么您基本上就不走运了。我的意思是,如果序列化格式记录在某处(我不确定是否),您可以编写自己的 BinaryFormatter - 但这可能有点棘手。

相反,您应该选择在您需要序列化/反序列化的任何地方都受支持的序列化格式。

【讨论】:

  • 不...我通过从 blob 列中选择来从数据库中获取字节 []。另外,我的 ArrayList 是由数据库 API 自动转换为 byte[] 的,所以我无权访问这个进程
  • 但是从什么开始存储字节数组呢?您要么需要更改它以使用更合理的序列化格式,要么可能在服务器上放置一个中间阶段。您如何将数据传输到移动设备?如果是通过 Web 服务,则该 Web 服务可以从数据库提供的内容中反序列化,并以您可以在 Windows Mobile 中使用的格式重新序列化。
  • 我正在使用 SQLite。当我将要存储的对象传递到 blob 列时,它会自动将其转换为 byte[]。事实是我似乎无法将序列化程序更改为自定义实现,并且.NET CF 默认不提供二进制反序列化程序
猜你喜欢
  • 1970-01-01
  • 2011-10-15
  • 1970-01-01
  • 2015-08-06
  • 2018-02-19
  • 1970-01-01
  • 2011-06-08
  • 1970-01-01
  • 2012-02-05
相关资源
最近更新 更多