我有不同的对象,我希望能够从我的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项目中,然后在两个平台上链接/使用它,从而获得相同的汇编值?
答案 0 :(得分:2)
BinaryFormatter生成不可互操作的二进制格式。仅在客户端和服务器运行相同版本的CLR时使用它。否则,您可以使用XML(XmlSerializer
)或JSON(JavaScriptSerializer
)等可互操作的格式在客户端和服务器之间进行通信。
答案 1 :(得分:1)
你最大的错误就是使用BinaryFormatter
。这有很多问题。
此用例的良好替代方案是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