C# 在桌面上序列化,在Silverlight中反序列化

C# 在桌面上序列化,在Silverlight中反序列化,c#,silverlight,serialization,C#,Silverlight,Serialization,我试图通过一个小型C#桌面应用程序创建内容,并将其显示在Silverlight应用程序中。(我正在创建普通的C#对象,并试图让它们轻松持久。)上下文是某种游戏,我有一个桌面工具,可以创建和编辑我想要的内容,然后Silverlight二进制文件使用它 如何在(桌面)C中序列化某些内容并在Silverlight中反序列化它? 我有一个为序列化而创建的小库;它用于Silverlight,一个简单的BinaryFormatter用于桌面。在每个平台内,这些都是可以的;但在不同的平台上,这两者显然是不兼容

我试图通过一个小型C#桌面应用程序创建内容,并将其显示在Silverlight应用程序中。(我正在创建普通的C#对象,并试图让它们轻松持久。)上下文是某种游戏,我有一个桌面工具,可以创建和编辑我想要的内容,然后Silverlight二进制文件使用它

如何在(桌面)C中序列化某些内容并在Silverlight中反序列化它?

我有一个为序列化而创建的小库;它用于Silverlight,一个简单的
BinaryFormatter
用于桌面。在每个平台内,这些都是可以的;但在不同的平台上,这两者显然是不兼容的

有可能这样做吗?我不想通过将数据保存为文本然后对其进行解析来恢复手动序列化,如果可能的话,我也不想使用嵌入式数据库。我可能有列表和其他复杂数据的列表,手动解析它太痛苦了

如果不可能,我还有什么选择

Edit:ProtoBuf.NET看起来还可以,但正如我在Marc的评论中提到的,我正在我自己的库中使用序列化程序。这意味着要求我的持久性库的用户向类添加属性来序列化它们将破坏封装。我不想那样做

破坏封装是什么意思

我的库(持久存储)的目标用户是游戏开发人员。他们将使用该库在游戏中保存信息

因此,它们只使用PersistentStorage.dll。在内部,持久性存储使用序列化程序(目前,Mike Talbot的用于Silverlight,简单的二进制用于非Silverlight)来持久化数据

对于我来说,“要使用我的库,请在所有类上放置
[ProtoContract]
[Serializable]
”会破坏封装。这意味着用户知道我的库使用的内部内容,而他们不应该知道。我明天可以更换序列化程序,他们不应该在意


我知道,作为一种解决方法,我可以要求他们使用
[PersistMe]
对所有内容进行属性化,并将其作为纯空属性,从而扩展序列化程序需要的任何属性。但我希望其他序列化程序,如Mike Talbot的,不需要任何属性即可使用。

在这种情况下,您需要使用相同的格式。由于BinaryFormatter对于Silverlight不合适,所以它已经过时了。就我个人而言,我会使用protobuf net,它可以在两者上工作,并且可以配置为在普通对象上工作(但如果可以添加属性,则更容易),但如果您的链接serialiser在桌面上工作,这也是一个可行的选项


对于您的模型示例,我可以说得更具体。

您是否尝试过JSON.net()之类的JSON序列化程序


JSON规范:

为什么不尝试使用XmlSerializer进行老式的xml序列化,桌面上的.Net framework和silverlight都应该有这个类。这样,框架中就没有可包含的附加库。

您可以尝试使用

从作者的页面:

在.NET 4和Silverlight之间序列化类

您可能希望使用SilverlightSerializer在Silverlight和.NET 4之间共享对象,可能是通过WCF链接。
在这些情况下,需要做的重要事情是定义要在仅引用System、System.Core和mscorlib的Silverlight程序集中共享的类。这些是可在两种类型的项目中使用的部件的要求。如果以这种方式定义类,那么它们可以在后端进行反序列化,而不会出现问题,引用任何其他内容都不会起作用。幸运的是,您需要的大部分都包含在这些系统组件中

我们使用WCF对Silverlight客户端进行所有序列化。我们在客户端和服务器之间共享了一个dll,其中包含所有数据传输对象和接口。这允许我们不使用wsdl在silverlight中生成服务引用

要进行searlization,我们使用带有BinaryMessageEncoding的DataContractSerializer。此外,您还必须注意对象的私有setter(这在silverlight中无法完成,因为您无法在silverlight的部分信任环境中使用私有setter设置属性)。如果您想使用泛型和其他类似的东西,请使用NetDataContractSerializer,但这将破坏与Java和.net之外其他基于标准的web服务的兼容性(但对于silverlight应该可以正常工作)

我们所有的DTO都是POCO,然后我们向其中一个属性(没有其他属性或接口)添加一个[ItemKey]属性,以便我们的系统知道哪个属性是主键(这不是必需的,但如果对象中的情况发生变化,它会使在持久性层中进行更新更加容易)。

您也可以查看。它允许您使用基于xml的格式或二进制格式进行序列化

我曾在类似的场景中使用它在Silverlight和非Silverlight应用程序之间共享数据,它工作得非常出色。

仅供参考:

  • 您可以构建单个SilverlightSerializer DLL并在.net和Silverlight中引用它。即使DLL以Silverlight为目标,这也可以工作

  • Silverlight运行时没有足够的安全权限,无法检查私有类成员。SilverlightSerializer让您可以编写支持类来序列化具有非标准要求的第三方组件,这可以用于私有成员,但在特定情况下,它是手动的,要求序列化类和序列化类是同一个类中的一个


谢谢,我去看看。问题是,我在平台上独立开发应用程序(游戏),从来没有maki的要求