C#中的序列化和Java中的反序列化

C#中的序列化和Java中的反序列化,c#,java,serialization,deserialization,C#,Java,Serialization,Deserialization,是否可以在C#中序列化类/对象,并在java中反序列化它们。我想序列化该类,而不是任何XML/JSON数据。请澄清 谢谢我在这里看到了3个选项。我建议选择1,Protobufs 查看谷歌的ProtoBufs 或者其他类似的。这里有一个 Protobufs是指这种语言互操作。它的二进制、小型、快速和语言不可知 它还具有向后兼容性,因此如果将来更改序列化对象,仍然可以读取它们。这个特性对您来说也是透明的,只要您编写的代码理解了在未序列化旧对象时可能丢失的新变量。这是一个巨大的优势 在另一种语言中实现

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


谢谢

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

查看谷歌的ProtoBufs

或者其他类似的。这里有一个

Protobufs是指这种语言互操作。它的二进制、小型、快速和语言不可知

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

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

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

手工编写序列化例程

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


对于ProtoBufs之类的库。这应该有助于您为您的用例选择最好的一个。

我们前一段时间做过这件事,经过大量的修补后,它起了作用,这实际上取决于字节编码,我认为JAva使用一个,而C使用另一个(小端与大端),因此您需要实现一个反序列化程序,将这一影响考虑在内。希望这对不使用本机序列化有所帮助。内置默认值与数据类型的二进制表示相关联,对于不同的VM,二进制表示是不同的。XML、JSON和类似技术的目的正是提供一种通用格式,可以在不同的系统之间移动。值得一提的是,序列化为JSON的开销通常很小,而且能够手动读取序列化的对象有很多好处,因此我建议使用JSON,除非您有非常具体的原因不能这样做。

考虑OMG的标准CORBA IIOP

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

  • 对于Java:JavaEEEJB基于IIOP,有RMI-IIOP;各种支持库。交付的是JDK

  • 有关C#IIOP与javaee的集成,请参见


正如其他人所建议的,您可以选择外部序列化库(Google Protobuff等),或者简单地使用内置的较慢/效率较低的带宽(JSON、XML等)。你也可以自己编写,但是相信我,这是一个维护噩梦。

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


关于BSON本身,请参见mongoDB博客

当然有可能,你尝试过什么?@Aada,不确定你是否能这么说,但是为什么不使用
XML
JSON
。“我只是想确保这不会成为一个类似于史蒂文的案子。”。很好的XY链接,从未见过。@Aada,序列化是一个宽泛的术语。您关心输出格式是什么吗?我在下面的回答中集中讨论了二进制,但是如果你更喜欢基于文本的JSON或XML,它们确实是最好的选择。@williammerrison是的,这很有趣。我简单地阅读了这个问题,当然也发了一篇关于JSON/XML的帖子,这篇文章立即被否决。当我看到OP明确表示不应该使用它们时,我感到很奇怪,所以我想要求澄清。我的公司必须解决同样的问题,幸运的是我们使用了自定义协议,而不是任何一种语言的内置序列化。我觉得如果不是这样的话会很艰难+1感谢你的努力。谢谢,我们都害怕战斗:)这个原始人的东西看起来很有希望,但我想它也会有自己的恶魔。我相信你是对的,尽管我很幸运没有遇到任何恶魔。嗨,梅胡尔,我完全不知道这件事。。您能帮助我理解如何创建您自己的反序列化程序吗?嗨,Willam,我正在尝试理解协议缓冲区,但没有找到任何好的教程,我尝试了类似的方法-。请建议。我可以。请接受并关闭此问题,因为您已开始新的问题?