【发布时间】:2011-07-24 20:49:20
【问题描述】:
我希望能够从我的 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 作为客户端结构和我的 ASP.NET 服务器中的数据结构(n 层架构),我也将其用作服务器端对象。
我要做的是像这样构建一个列表数组:
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));
...然后我想将它序列化为一个字节数组,这样我就可以将它作为二进制文件发布:
MemoryStream membytes = new MemoryStream();
BinaryFormatter binFormatter = new BinaryFormatter();
binFormatter.Serialize(membytes, hiscores );
...
但是 - 在网络服务器上,在 ASP.NET/C# 中我收到一个错误 500,告诉我它无法加载用于反序列化数据的程序集???
嗯?!我读过有人建议将组件作为外部组件?然后在两个平台上链接它,这可能在我的情况下还是我走错了路?
我可以轻松地将值从 0x00 到 0xff 的简单字节数组传输到我的 ASP.NET 并保存。但是一旦我开始在我的 List 对象上使用序列化/反序列化并将它们转换为 Byte[] 事情就搞砸了吗?
问题 如果序列化器不在同一个平台上,反序列化是不可能的吗?
是否可以将数据对象(业务对象)放在 DLL 项目中,然后在两个平台上链接/使用它,从而获得相同的组装价值?
【问题讨论】:
-
二进制序列化只应作为同一程序的不同部分之间的传输介质,不能用于系统之间,也不能作为存储格式。太多的版本信息被捆绑在一起,格式即使是很小的软件升级也无法生存,更不用说完全不同的系统了。
-
也许我应该编写自己的对象->二进制转换器并在双方都使用它?我有很多自定义游戏对象,因为它们需要从服务器加载并存储回来,我宁愿尽可能避免使用 XML 等。我担心 XML 版本会变得太大,双向产生太多流量。
-
然后试试 protobuf - code.google.com/p/protobuf-net
-
非常有趣!可能正是我需要的。谢谢。
-
@Lasse V. Karlsen,请将您的回复作为答案发布。我认为这解决了我的问题。
标签: c# asp.net serialization mono