【问题标题】:Deserialize binary data in Silverlight 4在 Silverlight 4 中反序列化二进制数据
【发布时间】:2011-10-12 16:22:31
【问题描述】:

我以为我在某处读到 Silverlight 4 将包含一个 BinaryFormatter 以支持在客户端应用程序中对二进制数据进行序列化/反序列化,但我似乎找不到它,所以我猜它不存在。

我需要从 Silverlight 4 应用程序访问现有服务。该服务使用 TCP 上的套接字。我已经能够连接客户端应用并能够从服务接收消息,但我无法反序列化消息的内容。

消息由服务器上序列化的以下对象组成:

class Message
{
    String Name { get; set; }
    Stream Data { get; set; }
}

我无法控制服务,并且无法更改格式、协议等。 (另外,fwiw,名称是可变长度的。)

如何在我的 Silverlight 客户端中重构 Message 对象?

【问题讨论】:

  • 高效的评论。尝试回答我的一个问题,您可能会看到该比率上升。

标签: silverlight serialization silverlight-4.0 deserialization binary-deserialization


【解决方案1】:

我什至不会尝试为 Silverlight 编写二进制反序列化器(我什至不相信它可能)。

相反(假设是一个 ASP.NET 主机站点)我会在主机站点中放置一个 WCF 服务作为一种代理。 WCF 服务将代表 silverlight 应用程序向您的服务发出请求。

【讨论】:

  • 它不是一个 ASP.NET 主机站点,它是一个推送模型(服务将消息推送到客户端应用程序,即没有请求)。
【解决方案2】:

你在找BinaryReader吗?

【讨论】:

  • 我不这么认为。这可以帮助实现对象,但前提是您知道二进制数据的确切组成。正如我所提到的,它将包含一个可变长度的字符串和一个可变长度的 Stream。
  • 数据在服务器上是如何序列化的?
  • 据我所知,通过对代码进行逆向工程,BinaryFormatter 用于将对象序列化为流,然后将其复制到 Socket 使用的 NetworkStream 中。
  • 这里没有一个简单的答案——BinaryFormatter 没有进入 SL4。
【解决方案3】:

因此,经过多次尝试和错误,我最终找到了以下问题的解决方案。

首先,我能够访问允许我更改 Message 类的服务器代码,因此 Data 属性不是返回 Stream,而是返回一个 Byte 数组。然后我使用 XmlSerializer 将对象序列化为传出的 NetworkStream。显然 XmlSerializer 默认会使用 Base64 编码,并将字节数组转换为可以包含在 XML 流中的字符串。

在 Silverlight 客户端中,我使用 XmlSerializer 将字节数组反序列化为客户端对象。

与二进制序列化不完全相同,但最终目标是反序列化从 SL 客户端上的 Socket 接收到的二进制数据(字节数组),这让我到了那里。

【讨论】:

    猜你喜欢
    • 2016-09-15
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    • 1970-01-01
    • 2014-11-28
    • 2016-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多