在MONO-client和ASP之间序列化/反序列化.. NET服务器-可能或不可能
本文关键字:服务器 不可能 NET 反序列化 MONO-client ASP 之间 序列化 | 更新日期: 2023-09-27 18:03:26
我有不同的对象,我希望能够加载并保存在ASP上。. NET (IIS web服务器)从我的MONO客户端。所以我把它们作为Class对象。
作为示例,我有[Score],我将使用它在服务器上生成历史。
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作为客户端结构和我的ASP中使用此代码作为数据结构(n层架构)。. 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));
…然后我要把它序列化成一个字节数组这样我就可以POST它为binaryfile:
MemoryStream membytes = new MemoryStream();
BinaryFormatter binFormatter = new BinaryFormatter();
binFormatter.Serialize(membytes, hiscores );
…
BUT -在web服务器上,在ASP中。我得到一个错误500告诉我,它不能加载汇编反序列化的数据?
啊? !我读到有人建议把组装做成外部的?然后在两个平台上链接,这在我的情况下可能吗,还是我走错了路?
我可以很容易地转移一个简单的字节数组值从0x00到0xff到我的ASP。. NET并保存。但是一旦我开始使用序列化/反序列化我的列表对象,并将它们转移到一个Byte[]事情搞砸了吗?
如果序列化器不是在同一平台上制作的,反序列化是否不可能?
是否有可能将数据对象(业务对象)放在DLL项目中,然后在两个平台上链接/使用它,从而获得相同的组装值?
BinaryFormatter生成一个不可互操作的二进制格式。只有在客户端和服务器运行相同版本的CLR时才使用它。否则,您可以使用可互操作的格式,如XML (XmlSerializer
)或JSON (JavaScriptSerializer
)在客户端和服务器之间进行通信。
你最大的错误是使用BinaryFormatter
。这有很多问题。
- 你应该信任你反序列化的数据。这在客户机-服务器应用程序中很少出现。
- 它使用了一些内部格式,我不确定不同版本的。net之间甚至。net和mono之间的兼容性如何。使用具有良好定义格式的序列化器。
对于这个用例,Json或Xml序列化器是很好的替代方案。我个人通常使用Json.net,但是。net也有一个内置的Json序列化器。
BinaryFormatter
可能是正确的选择,如果您序列化一个复杂的对象图,不需要版本控制,只在同一个系统上读取它,所以您可以信任数据。即使在这种情况下,我也只会使用它,因为我不知道有更好的选择,而不是因为我喜欢BinaryFormatter
。
既然你现在说你传输了很多数据,我就研究一下protobuf-net。它是一个二进制序列化器,速度非常快,并产生紧凑的数据。但是您应该用数字id注释所有属性。它的作者Marc Gravell在SO上很活跃,所以你可以期待很好的支持。
张贴我自己的答案,因为我实际上设法让它没有额外的工作
首先,感谢所有关于额外库的伟大建议,但我最初的问题是关于是否有可能制作MONO和ASP。. NET通过序列化进行通信。
答案是:YES!
我所要做的就是建立一个单独的类项目(DLL),我把我需要序列化的所有数据结构。
然后使它成为两个平台上的引用,瞧,相同的DLL =相同的程序集,两个平台都同意序列化和反序列化是没有问题的。
二进制结果说明/traffic/space
我同意,与这里的其他一些建议的插件/库相比,二进制数据似乎有点"过度杀伤"。但这是可能的,没有任何额外的lib。
我使用了Mike Talbot的Silverlight Serializer http://whydoidoit.com/2010/04/08/silverlight-serialization/它是非常轻量级的,应该可以与MONO和。net一起工作