【问题标题】:Deserialize RabbitMQ message generated by C# in Java在 Java 中反序列化 C# 生成的 RabbitMQ 消息
【发布时间】:2019-04-02 02:16:26
【问题描述】:

我在 C# 中有一个 RabbitMQ 数据服务并“输出”一些消息。订阅者/客户端使用 Java。我可以接收消息,我知道如何在 C# 中反序列化,但我不知道如何将消息反序列化为对象。在 Java 中。

C# 序列化:

byte[] message;
BinaryFormatter bf = new BinaryFormatter();
using (var ms = new MemoryStream())
{
    bf.Serialize(ms, updateMessage);
    message = ms.ToArray();
}

C# 反序列化:

MyObject message = null;
using (var memStream = new MemoryStream())
{
    var binForm = new BinaryFormatter();
    memStream.Write(body, 0, body.Length);
    memStream.Seek(0, SeekOrigin.Begin);
    message = (MyObject)binForm.Deserialize(memStream);
}

Java 接收器:

@RabbitListener(queues = queueName)
public void receive(??? message ) {
    // deserailize message right here
    // btw, I do not know what type of received message should be initialized.
}

【问题讨论】:

  • 我不明白你为什么要连载。 RabbitMQ 不会为您处理所有这些吗?
  • 我不认为 BinaryFormatter 真的打算在 .NET 世界之外使用。
  • 默认的 RabbitMQ 编码是var body = Encoding.UTF8.GetBytes(message);,但是我使用不同的方式来编码消息。

标签: java c# serialization memorystream binaryformatter


【解决方案1】:

反序列化使用 .NET 内置的二进制序列化程序序列化的 Java 对象是不可能的(您必须自己实现反序列化程序)。

最简单的选择是使用基于文本的序列化选项,例如 JSON 和 XML。有很多关于如何在 C# 和 Java 中执行此操作的教程。

如果您需要使用二进制格式,可以使用 Google 的协议缓冲区或 apache thrift。

【讨论】:

  • 我无法更改发布端(序列化器),所以我唯一能做的就是尝试将内存流的二进制数组反序列化为 Object。你知道怎么做吗?我的意思是如何自己实现序列化程序。谢谢。
  • 我没有找到在二进制序列化程序中反序列化 .NET 构建的方法。我将消息的格式从 memoryStream 的二进制更改为字符串。并且很容易在Java中处理UTF-8的二进制数组。谢谢你的回答。
猜你喜欢
  • 2013-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-15
相关资源
最近更新 更多