在MONO-client和ASP.NET服务器之间进行序列化/反序列化 – 可能与否?

我有不同的对象,我希望能够从我的MONO客户端加载和保存在ASP.NET(IIS网络服务器)上 。 所以我把它们作为Class对象。

作为示例,我有[Score],我将用于在服务器上生成一个hiscore。

Score.cs

using System.Runtime.Serialization; [System.Serializable] public class Score { public long Total; public string Name; public Score(){} public Score(string name, long total) { Total = total; Name = name; } } 

这个代码我想用作MONO作为客户端结构的数据结构(n层架构),在我的ASP.NET服务器中我也将它用作服务器端对象。

我所做的是我想构建一个像这样的列表数组:

 List hiscores = new List(); hiscores.add (new Score("Player 1", 10000)); hiscores.add (new Score("Player 2", 20000)); hiscores.add (new Score("Player 3", 30000)); hiscores.add (new Score("Player 4", 40000)); 

…然后我想将它序列化为一个bytearray,所以我可以将它作为二进制文件POST:

 MemoryStream membytes = new MemoryStream(); BinaryFormatter binFormatter = new BinaryFormatter(); binFormatter.Serialize(membytes, hiscores ); 

但是 – 在web服务器上,在ASP.NET / C#中我得到一个错误500告诉我它无法加载汇编以反序列化数据???

HUH? 我读过有人建议将汇编作为外部汇编? 然后在两个平台上链接它,在我的情况下是可能的还是我在错误的路径上?

我可以轻松地将值为0x00到0xff的simle bytearray传输到我的ASP.NET并保存。 但是,一旦我开始在List对象上使用serialize / deserialize并将它们转移到Byte []中,事情会变得混乱?

问题如果序列化程序不在同一平台上制作,则无法进行反序列化吗?

是否可以将数据对象(业务对象)放在DLL项目中,然后在两个平台上链接/使用它,并获得相同的汇编值?

BinaryFormatter生成不可互操作的二进制格式。 仅在客户端和服务器运行相同版本的CLR时使用它。 否则,您可以使用XML( XmlSerializer )或JSON( JavaScriptSerializer )等可互操作的格式在客户端和服务器之间进行通信。

你最大的错误就是使用BinaryFormatter 。 这有很多问题。

  1. 您应该信任您反序列化的数据。 在客户端 – 服务器应用程序中很少出现这种情况。
  2. 它使用了一些内部格式,我不确定不同版本的.net之间甚至是.net和mono之间的兼容性。 使用具有良好定义格式的序列化程序。

这个用例的好选择是Json或Xml序列化器。 个人通常使用Json.net,但.net也有一个内置的Json序列化器。

如果序列化复杂的对象图, BinaryFormatter可能是正确的选择,不需要版本控制,只能在同一系统上读取它,因此您可以信任数据。 甚至在那种情况下我只会使用它,因为我知道没有更好的选择,不是因为我喜欢BinaryFormatter


既然你现在说你转移了很多数据我会看看protobuf-net。 它是一个非常快速的二进制串行器,可以生成紧凑的数据。 但是您应该使用数字ID注释所有属性。 它的作者Marc Gravell在这里活跃于SO,所以你可以得到很好的支持。

发布我自己的答案,因为我实际上设法让它没有额外的工作

首先,感谢所有关于额外库的好建议,但我最初的问题是关于是否有可能使MONO和ASP.NET通过序列化进行通信。

答案是:是的!

我所要做的就是构建一个单独的类项目(DLL),我将所有数据结构都序列化。

然后使它成为两个平台上的引用,同样的DLL =相同的程序集,并且两个平台都同意序列化和反序列化没有问题。

关于二进制结果/流量/空间的注释

我同意,与这里的一些其他建议的插件/库相比,二进制数据似乎有点“过度杀伤”。 但它可能没有任何额外的库。

那是我最初的目标。

我使用了Mike Talbot的Silverlight Serializer http://whydoidoit.com/2010/04/08/silverlight-serialization/ ,它非常轻量级,可以同时使用MONO和.NET