我需要在紧凑框架上从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);
}
}
答案 0 :(得分:10)
对于您的方案,您可以考虑切换protobuf-net;这与BinaryFormatter
的格式不同,因此客户端和服务器都需要调整,但它是一个可在两个平台上运行的二进制序列化API,并且typically much smaller作为额外的补充。格式实际上是google的“协议缓冲区”编码;非常快速,独立于平台,并且在添加属性等时设计灵活。它是免费的。有些傻瓜只是放弃了。
答案 1 :(得分:3)
我们最初使用的As Good As It Gets Compact Framework Serialization与完整框架BinaryFormatter完全二进制兼容,但每个设备的许可是一个交易破坏者。根据您需要支持的设备数量,它可能适合您。我们还发现BinaryFormatter确实有内存和时间开销 - 不是接近SoapFormatter的成本,但对于CE设备仍然很重要。
最后,我们使用BinaryWriter和BinaryReader以及System.Activator创建了一个序列化框架来创建类。这使得我们可以消除与内置序列化相关的大量内存和时间开销,代价是对象的仔细版本化和字段的排序。应该注意的是,我们的自定义序列化工作早于protbuf.net的发布。
答案 2 :(得分:2)
您可以在此处找到CF所需内容的实现:http://www.codeproject.com/KB/cs/CF_serializer.aspx
也很有趣:how to serialize objects in compact framework
我自己没有尝试过,因为我从来不需要它。对不起,如果我只发布一些链接。
答案 3 :(得分:0)
来自MSDN的Differences between the .NET Compact Framework and the .NET Framework:
<强>序列化强>
由于大小和性能方面的考虑,.NET Compact Framework不支持使用BinaryFormatter进行二进制序列化,也不支持使用SoapFormatter进行SOAP序列化。
但是,.NET Compact Framework确实为通过在XML Web服务中使用SOAP以及将数据集序列化为XML来传输对象数据提供了序列化支持。