如何在Windows Phone 7中使用BinaryFormatter

5

我该如何在Windows Phone 7中使用BinaryFormatter?

我在service1.svc.cs中使用using System.Runtime.Serialization.Formatters.Binary,但我无法在Windows Phone 7中使用此引用。

有没有解决方案?

我的反序列化对象的代码:

 public static T DeserializeObject<T>(byte[] xml)
    {
        BinaryFormatter xs = new BinaryFormatter();
        MemoryStream memoryStream = new MemoryStream(xml);
        return (T)xs.Deserialize(memoryStream);
    } 

在Windows Phone 7中,BinaryFormatter会出现错误。那么我该如何进行反序列化操作呢?需要对代码做哪些更改?


你的服务目前没有可行的解决方案。你需要更改服务,使用Windows Phone 7支持的序列化格式。如果你的服务是WCF,为什么不使用DataContractSerializer并让WCF处理序列化/反序列化呢? - Chris Dickson
3个回答

6
如@driis所提到的,您无法在Windows Phone上使用BinaryFormatter。 您可以在WCF端点(即其绑定为具有BinaryMessageEncodingBindingElement和HttpTransportBindingElement的自定义绑定的端点)中使用二进制编码,并且这将受到WP7支持。 您只是不能在那里使用二进制格式化程序。
更新以下评论: 查看您的代码,不仅需要更改该代码 - 您还需要更改服务代码,以序列化以Silverlight支持的格式中的对象。 您可以使用DataContractSerializer,带有二进制读取器/写入器,或者您可以使用在这两种情况下都受支持的另一个库。 例如,下面的代码应在桌面和SL版本中工作:
public static T DeserializeObject<T>(byte[] xml) 
{ 
    using (MemoryStream memoryStream = new MemoryStream(xml))
    {
        using (XmlDictionaryReader reader = XmlDictionaryReader.CreateBinaryReader(
            memoryStream, XmlDictionaryReaderQuotas.Max))
        {
            DataContractSerializer dcs = new DataContractSerializer(typeof(T));
            return (T)dcs.ReadObject(reader);
        }
    }
}

在服务器上:

public static byte[] SerializeObject<T>(T obj)
{
    using (MemoryStream ms = new MemoryStream())
    {
        using (XmlDictionaryWriter writer = XmlDictionaryWriter.CreateBinaryWriter(ms))
        {
            DataContractSerializer dcs = new DataContractSerializer(typeof(T));
            dcs.WriteObject(writer, obj);
            writer.Flush();
            return ms.ToArray();
        }
    }
}

这段代码给我报错,错误信息如下:Message = "Type 'System.Net.PathList' with data contract name 'PathList:http://schemas.datacontract.org/2004/07/System.Net' is not expected. Consider using a DataContractResolver or add any types not known statically to the list of known types." - Ajay
你试图序列化什么类型的对象? - carlosfigueira
默认序列化程序在SL中无法序列化Cookie容器,因此您可以选择另一个序列化程序(如果我没记错的话,可以使用Newtonsoft的JSON.NET进行序列化),或者选择使用数据传输对象将Cookie容器转换为可序列化的数据类型。 - carlosfigueira
我该如何使用JSON.net进行序列化和反序列化?能否给我一些相关的代码? - Ajay
请你检查一下你作为答案发布的代码。它不能正常工作,会出现错误。或者你能否给我一个使用json.net的代码?我已经花了5天时间解决这个错误,但还没有找到解决办法。 - Ajay

2

Windows Phone 7不支持BinaryFormatter。


你不能这样做。你需要切换到一个在两个平台上都支持的序列化引擎。也许是protobuf-net,在这里接受答案并获取更多信息:https://dev59.com/nFTTa4cB1Zd3GeqPt5k1 - driis

0

在WP 7.1上,没有二进制序列化的库支持,正如driis所提到的。

相反,您应该使用XmlObjectSerializer,甚至是它支持大多数常见API对象(如联系人数据等)序列化的子类之一。

如果您检查了System.Runtime.Serialization命名空间程序集(例如在Visual Studio的对象浏览器中),您会发现适当类的层次结构。

而且,为什么您关心序列化方法呢?XML序列化更具可移植性,更统一,并且更容易被人阅读。


我是新手,不知道如何使用这个。我会在我的问题中发布我的代码。 - Ajay
carlosfigueira 发布了一个非常明智的答案来消除你的疑虑。使用他的解决方案,因为它看起来很不错(https://dev59.com/Q2jWa4cB1Zd3GeqPplUn#12376808)。 - Krzysztof Jabłoński

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接