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

时间:2011-02-23 13:46:34

标签: c# .net compact-framework

我需要在紧凑框架上从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);
    }
}

4 个答案:

答案 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来传输对象数据提供了序列化支持。