【问题标题】:Serializing a Java object and deserializing in C#在 C# 中序列化 Java 对象和反序列化
【发布时间】:2016-10-24 10:09:22
【问题描述】:

我正在编写一个应用程序,它需要将许多状态变量从 java 传递到 C#。我需要为此序列化整个对象,然后以某种方式在 C# 中反序列化它并在 C# 中启动相应的对象。这可能吗?

我可以为此目的使用默认的 java 序列化吗?如果是,怎么做?

PS:有问题的对象来自一个抽象类。扩展这个抽象类的类是需要序列化的类,它的定义可以根据用户的喜好而变化。

PPS:在被无数次重定向到google开发者页面后,我正在考虑使用WOX(主要是因为它非常“好用”),但它似乎已经过时了,最后没有新的更新数年。是否有任何替代方案,具有相当的易用性?

【问题讨论】:

标签: java c# serialization protocol-buffers xmlserializer


【解决方案1】:

我可以为此目的使用默认的 java 序列化吗?

默认 Java 序列化是什么意思,是二进制还是文本。如果它的二进制然后否,你不能由于两个框架,Java(字节码),.Net(IL)之间不同的二进制标准。让它们兼容并不容易。如果它的文本像 Json、Xml 或者可能是自定义文本格式,那么应该很容易实现,这就是 Web 服务和 Rest API 用于在不同系统之间进行通信的方式,它们使用基于文本的 Http 序列化作为传输协议。

Web 服务 - Soap (Http + Xml),Json 是经过改造的,不是原始规范的一部分。

Rest API - Http + Json / Xml,实际上与Java脚本无缝集成

【讨论】:

  • 据我了解,它是二进制的。
【解决方案2】:

不,您不能使用默认序列化,因为 java 和 c# 没有兼容的序列化程序。您必须实现该类两次并使用您自己的代码在两种语言之间进行翻译。

要将您的类实例从 java 移动到 c#,您需要收集 java 类的所有属性并使用它们来实例化一个新的 c# 对象。

您可以手动执行此操作,也可以使用一些帮助程序,例如 googles 协议缓冲区。

编辑: protobuf 的示例: Protobuf 只能保存您的数据而不是您的类逻辑。它不知道面向对象的概念。一个抽象的java类可以这样翻译:

Java类:

abstract class Abs{
   int i;
}
class Real extends Abs{
   int k;
}

Protobuf:

message Abs{
    optional int32 i = 1;
}
message Real{
    optional Abs   base = 1;
    optional int32 k    = 2;
}

【讨论】:

  • 使用 protobuf,我想我将不得不编写 .proto 文件。我该如何为抽象类做到这一点?
  • 在您的示例中,看来我必须事先知道 Real 类中的所有字段,这在我的情况下是不可能的,除非我每次有人给我一个新的 .proto 文件时都编写一个新文件真实文件。
  • 如果您有许多不同的类,您应该将序列化委托给它们。使用方法序列化/反序列化创建一个接口,并让它们创建一个 xml 文件或其他任何东西。您还可以尝试制作一个包含许多重复和可选字段的通用 protobufmessage。
  • 也许你应该尝试创建一个可以处理所有用户偏好的类
【解决方案3】:

您可以将对象转换为 xml,然后将 xml 传递给 C#,然后再将 xml 转换为 C# 对象或以其他方式检索的数据。

【讨论】:

    猜你喜欢
    • 2021-04-22
    • 1970-01-01
    • 1970-01-01
    • 2017-08-02
    • 2018-07-11
    • 2015-09-16
    • 2016-10-14
    • 2014-12-24
    • 2013-04-11
    相关资源
    最近更新 更多