我正在尝试通过小型C#桌面应用程序创建内容,并将其显示在Silverlight应用程序中。 (我正在创建普通的普通C#对象,并试图使它们容易持久化。)上下文是某种游戏,我有一个桌面工具,可以让我创建和编辑我想要的内容,然后是Silverlight二进制消耗它。
如何在(桌面)C#中序列化某些内容并在Silverlight中对其进行反序列化?
我有一个我为序列化创建的小型库;它对Silverlight使用Mike Talbot's amazing serializer,对桌面使用简单的BinaryFormatter
。在每个平台内,这些都可以;但是跨平台,这两者显然是不相容的。
有可能这样做吗?我不希望通过将数据保存为文本然后解析它来恢复手动序列化,如果可能的话我不想使用嵌入式数据库。我可能有列表和其他复杂数据列表,手动解析它太痛苦了。
如果不可能,我有哪些替代方案?
编辑:ProtoBuf .NET看起来还不错,但正如我在Marc的评论中所提到的,我在我自己的库中使用了序列化程序。这意味着需要用户我的持久性库向类添加属性以序列化它们将破坏封装。我不想那样做。
打破封装是什么意思?
我的库(Persistent Storage)的目标用户是游戏开发人员。他们将使用该库在游戏中保留信息。
因此,他们只使用PersistentStorage.dll。在内部,持久存储使用序列化程序(目前,用于Silverlight的Mike Talbot和用于非Silverlight的简单二进制文件)来保存数据。
让我说“嘿伙计们,使用我的图书馆,把[ProtoContract]
或[Serializable]
放在你的所有课堂上”打破封装。这意味着用户知道我的库使用的内部,他们不应该这样做。我明天可以改变序列化,他们不应该在意。
我知道作为一种解决方法,我可以要求他们将所有内容都归入[PersistMe]
,并将其作为一个简单的空属性,反过来,它扩展了我的序列化程序所需的任何属性。但我希望其他序列化程序,如Mike Talbot,不需要任何归属使用。
答案 0 :(得分:3)
您可以尝试使用Silverlight Serializer
来自作者的页面:
在 .NET 4和Silverlight 之间序列化类
您可能希望使用 SilverlightSerializer 在Silverlight和.NET 4之间共享对象,可能是通过WCF链接。 在这些情况下,最重要的事情是在Silverlight程序集中定义要共享的类,该程序集仅引用System,System.Core和mscorlib。这些是可以在两种类型的项目中使用的程序集的要求。如果你以这种方式定义你的类,那么它们可以在后端反序列化而没有问题,引用任何其他内容它将无法工作。幸运的是,您需要的大部分内容都包含在这些系统程序集中!
答案 1 :(得分:1)
您需要在此方案中使用相同的格式。由于BinaryFormatter不适用于Silverlight,所以就是这样。我个人使用protobuf-net,它可以在两者上运行,并且可以配置为在vanilla对象上工作(但如果你可以添加属性则更容易),但是如果链接的序列化器在桌面上工作也是可行的选择。
以您的模型为例,我可以更具体。
答案 2 :(得分:1)
为什么不尝试使用XmlSerializer进行旧式xml序列化,桌面上的.Net框架和silverlight应该具有该类。这样就没有要包含的附加库,它在框架中。
答案 3 :(得分:1)
您还可以查看Sharp serializer。它允许您使用基于xml的格式化或二进制格式化进行序列化。
我在类似的场景中使用过它来在Silverlight和非Silverlight应用程序之间共享数据,它运行得很漂亮。
答案 4 :(得分:1)
仅供参考:
您可以构建一个SilverlightSerializer DLL并在.net和Silverlight中引用它。即使DLL针对Silverlight
Silverlight运行时没有足够的安全权限来启用对私有类成员的检查。 SilverlightSerializer允许您编写支持类来序列化具有非标准要求的第三方组件,这可以适用于私有成员,但在特定情况下它是手动的,并且要求序列化类和序列化类是同一个。
答案 5 :(得分:0)
您是否尝试过像JSON.net(http://json.codeplex.com/)这样的JSON Serializer?
JSON规范:http://json.org
答案 6 :(得分:0)
我们使用WCF对Silverlight客户端进行所有序列化。我们在客户端和服务器之间共享一个dll,它具有所有数据传输对象和接口。这允许我们不使用wsdl在silverlight中生成服务引用。
要进行searlization,我们将DataContractSerializer与BinaryMessageEncoding一起使用。此外,你必须要注意私人的对象设置者(不能在silverlight中完成,因为你不能在Silverlight的部分信任环境中设置一个私人二传手的属性)。如果你想使用泛型和其他类似的东西,使用NetDataContractSerializer,但这将破坏与.net之外的Java和其他基于标准的Web服务的兼容性(但是应该适用于silverlight)。
我们所有的DTO都是POCO,除此之外我们将一个[ItemKey]属性添加到其中一个属性(没有其他属性或接口),这样我们的系统就知道哪个属性是主键(这不是必需的,但是它会产生一些东西)如果对象中的内容发生变化,则更容易在持久层中进行更新。