1

我以为我曾经在某处读过Silverlight 4将包含BinaryFormatter以支持客户端应用程序中的序列化/反序列化二进制数据,但似乎无法找到它,所以我猜测它不在那里。反序列化Silverlight 4中的二进制数据

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

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

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

我没有通过业务控制和改变文件格式,协议等是不是一个选项。 (另外,fwiw,Name是可变长度。)

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

+0

非常有生产力的评论。尝试回答我的一个问题,你可能会看到这个速度上升。 – SonOfPirate

回答

0

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

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

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

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

2

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

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

+0

它不是一个ASP.NET主机站点,它是一个推送模型(该服务将消息推送到客户端应用程序,即没有请求)。 – SonOfPirate

0

您是否在寻找BinaryReader

+0

我不这么认为。这可以帮助实现一个对象,但前提是你知道二进制数据的确切组成。正如我所提到的,它将包含一个可变长度的字符串和一个可变长度的Stream。 – SonOfPirate

+1

如何在服务器上序列化数据? –

+0

据我所知,通过对代码进行反向工程,BinaryFormatter被用来将对象序列化为一个流,然后将其复制到Socket使用的NetworkStream中。 – SonOfPirate

相关问题