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

时间:2011-07-24 20:49:21

标签: c# asp.net serialization mono

我有不同的对象,我希望能够从我的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<Score> hiscores = new List<Score>();
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,这样我就可以将它作为二进制文件发布:

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对象上使用序列化/反序列化并将它们转换为Byte [],事情会变得混乱?

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

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

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

  1. 您应该信任您反序列化的数据。在客户端 - 服务器应用程序中很少出现这种情况。
  2. 它使用了一些内部格式,我不确定.net的不同版本之间的兼容性,甚至是.net和mono之间的兼容性。使用格式良好的序列化程序。
  3. 此用例的良好替代方案是Json或Xml序列化程序。个人通常使用Json.net,但.net也有一个内置的Json序列化器。

    如果序列化复杂的对象图,

    BinaryFormatter可能是正确的选择,不需要版本控制,只能在同一系统上读取它,因此您可以信任数据。即使在那种情况下,我也只会使用它,因为我知道没有更好的选择,不是因为我喜欢BinaryFormatter


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

答案 2 :(得分:1)

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

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

答案是:是的!

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

然后在两个平台上进行引用,同样的DLL =相同的程序集,两个平台都同意序列化和反序列化没有问题。

关于二元结果/流量/空间的说明

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

这是我最初的目标。

答案 3 :(得分:0)

我使用过Mike Talbot的Silverlight Serializer http://whydoidoit.com/2010/04/08/silverlight-serialization/ 这是非常轻量级的,应该适用于MONO和.NET