【问题标题】:Serialization in C# and de-serialization in JavaC#中的序列化和Java中的反序列化
【发布时间】:2013-07-31 18:26:04
【问题描述】:

是否可以在 C# 中序列化类/对象并在 java 中反序列化。我想序列化类而不是任何 XML/JSON 数据。请澄清。

谢谢

【问题讨论】:

  • 当然可以,你试过什么?
  • @Aada,不确定您是否可以这么说,但您为什么不想使用XMLJSON。我只是想确保这不会成为XY-problem 的情况。
  • @SteveP。指向 XY 的不错链接,从未见过。
  • @Aada,序列化是一个广义的术语。你关心输出格式是什么吗?我在下面的答案中专注于二进制,但是如果您更喜欢基于文本的 JSON 或 XML 确实是最好的选择。
  • @WilliamMorrison 是的,这很有趣。我简要地阅读了这个问题,当然也发表了一篇关于 JSON/XML 的帖子,但很快就被否决了。当我看到 OP 明确声明不应该使用它们时,这让我觉得很奇怪,所以我想要求澄清一下。

标签: c# java serialization deserialization


【解决方案1】:

我在这里看到 3 个选项。我建议选项 1,Protobufs。

查看 Google 的 ProtoBufs

或类似的。这是java version. 这是C# port.

Protobufs 用于这种语言互操作。它的二进制、小型、快速且与语言无关。

它还具有向后兼容性,因此如果您将来更改序列化对象,您仍然可以读取它们。这个特性对你来说也是透明的,只要你编写代码理解新变量在非序列化旧对象时可能会丢失。这是一个巨大的优势!

在另一种语言中实现一种语言的默认序列化

您可以尝试在 C# 中实现 java 序列化逻辑,或在 Java 中实现 C# 序列化例程。我不建议这样做,因为它会更困难,更冗长,几乎肯定会在您编写新代码时变慢,并且会为您带来相同的结果。

手工编写序列化例程

这肯定会很快,但很乏味,更容易出错,更难维护,更不灵活......

Here's some benchmarks 用于像 ProtoBufs 这样的库。这应该有助于您选择最适合您的用例。

【讨论】:

  • 嗨,Willam,我正在尝试了解协议缓冲区,但没有找到任何好的教程,我尝试了类似的方法 - stackoverflow.com/questions/18063793/…。请提出建议。
  • 会的。请接受并关闭这个问题,因为您已经开始了一个新问题?
【解决方案2】:

我们前段时间做了这个,经过大量修补后它工作了,它真的取决于字节编码,我认为 JAva 使用一个而 C# 使用另一个(小端与大端)所以你需要实现一个反序列化器考虑到这一影响。希望这会有所帮助

【讨论】:

  • 我的公司不得不解决同样的问题,幸运的是我们使用了自定义协议而不是任何一种语言的内置序列化。有一种感觉,否则会很粗糙。为您的奋斗+1。
  • 谢谢,我们都害怕战斗 :) 这个 protobuff 东西看起来很有希望,但我认为它会有自己的恶魔。
  • 我相信你是对的,虽然我已经很幸运没有遇到任何问题。
  • 嗨 Mehul,我完全不知道这件事.. 请您帮忙让我了解如何创建自己的反序列化器。?
【解决方案3】:

正如其他人所建议的那样,您的选择将是外部序列化库(Google Protobuff、Apache Thrift 等),或者只是使用在带宽方面较慢/效率较低的内置工具(JSON、XML 等) .你也可以自己写,但相信我,这是维护的噩梦。

【讨论】:

    【解决方案4】:

    不使用本机序列化。内置默认值与数据类型的二进制表示相关联,对于不同的 VM,这些表示不同。 XML、JSON 和类似技术的目的正是提供一种通用格式,并且可以在不同系统之间移动。对于它的价值,序列化为 JSON 的开销通常很小,并且能够手动读取序列化对象有很多好处,所以我推荐 JSON,除非你有一个非常具体的原因你不能。

    【讨论】:

      【解决方案5】:

      考虑一下 OMG 的标准 CORBA IIOP。

      虽然很多人不需要 CORBA 的全面“远程对象”支持,但 IIOP 是用于通过网络“移动与语言无关的对象”(例如对象值参数)的底层二进制协议。

      • 对于 Java:Java EE EJB 基于 IIOP,有 RMI-IIOP;各种支持库。 IDL-to-Java compiler 随 JDK 一起提供。

      • 有关 C# IIOP 和与 Java EE 的集成,请参阅 IIOP.NET

      【讨论】:

        【解决方案6】:

        你也可以考虑BSON,MongoDB使用的。 如果您的 C#/Java 程序可以与 mongodb 数据库通信,则可以将对象存储在那里并使用适当的驱动程序读取它。

        关于 BSON 本身,请参阅 mongoDB 博客上的 BSON and Data Interchange

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-01-06
          • 2012-09-22
          • 1970-01-01
          • 2013-01-08
          • 2015-05-18
          • 1970-01-01
          • 2011-08-17
          相关资源
          最近更新 更多