CF中不存在BinaryFormatter。 解决方案?

我需要在紧凑的框架上对byte中的obj进行序列化/反序列化,但是没有BinaryFormatter,我该怎么办? 谢谢。 这是我在服务器端使用的类,我也想在客户端上使用它(具有windows mobile 6的设备)

public class Serializer { public byte[] SerializeObject(object obj) { if (obj == null) return null; using (MemoryStream stream = new MemoryStream()) { BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(stream, obj); return stream.ToArray(); } } public object DeserializeObject(byte[] bytes) { if (bytes == null) return null; BinaryFormatter formatter = new BinaryFormatter(); MemoryStream stream = new MemoryStream(bytes); return formatter.Deserialize(stream); } } 

对于您的场景,您可以考虑切换protobuf-net ; 这与BinaryFormatter格式不同,因此客户端和服务器都需要调整,但它是一个可在两个平台上运行的二进制序列化API,并且通常小得多,作为额外的附加function。 格式实际上是google的“协议缓冲区”编码; 非常快速,独立于平台,并且在添加属性等时设计灵活。它是免费的。 有些傻瓜只是放弃了。

我们最初使用As Good As It获取紧凑框架序列化 ,它与完整框架BinaryFormatter完全二进制兼容,但每个设备许可是一个交易破坏者。 根据您需要支持的设备数量,它可能适合您。 我们还发现BinaryFormatter确实有内存和时间开销 – 不是接近SoapFormatter的成本,但对于CE设备仍然很重要。

最后,我们使用BinaryWriter和BinaryReader以及System.Activator创建了一个序列化框架来创建类。 这使我们能够消除与内置序列化相关的大量内存和时间开销,代价是对象的仔细版本化和字段的排序。 应该注意的是,我们的自定义序列化工作早于protbuf.net的发布。

您可以在此处找到 CF所需的实现: http : //www.codeproject.com/KB/cs/CF_serializer.aspx

也很有趣: 如何在紧凑的框架中序列化对象

我自己没有尝试过,因为我从来没有需要它。 对不起,如果我只发布几个链接。

从MSDN的.NET Compact Framework和.NET Framework之间的差异 :

序列化

由于大小和性能方面的考虑,.NET Compact Framework不支持使用BinaryFormatter进行二进制序列化,也不支持使用SoapFormatter进行SOAP序列化。

但是,.NET Compact Framework确实为通过在XML Web服务中使用SOAP以及将数据集序列化为XML来传输对象数据提供了序列化支持。