微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何序列化要通过 Java RSocket 发送的 POJO?

如何解决如何序列化要通过 Java RSocket 发送的 POJO?

我正在尝试通过 RSocket requestStream 发送 POJO:

import java.io.Serializable;

class GreetingRequest implements Serializable {
    private String name;

    public GreetingRequest() {}

    public GreetingRequest(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

如果我要发送一个字符串,我可以这样做:

ByteBuf data = ByteBufAllocator.DEFAULT.buffer().writeBytes("Hello".getBytes());

socket.requestStream(DefaultPayload.create(data,Metadata))
        .map(Payload::getDataUtf8)
        .toIterable()
        .forEach(System.out::println);

但是我怎样才能序列化我的 POJO?

这是我尝试使用 implementation group: 'org.apache.commons',name: 'commons-lang3',version: '3.12.0' 但不起作用:

GreetingRequest pojo = new GreetingRequest("Davide");
ByteBuf data = SerializationUtils.serialize(pojo);

socket.requestStream(DefaultPayload.create(data,Metadata))
        .map(Payload::getDataUtf8)
        .toIterable()
        .forEach(System.out::println);

解决方法

有一种我不推荐的原生 java 序列化机制,但您可以阅读它。阅读 Java API 中的 Serialazable 接口。我推荐两个选项:

  1. JSON-JACKSON(也称为更快的 XML)
  2. GSON(在 César Ferreira 的回答中提到)

两者都将类转换为 JSON,反之亦然。对于 JSON-JACKSON,请参见类 ObectMapper。特别是方法 writeValueAsString()writeValueAsBytes() 将您的对象序列化为 JSON 字符串或字节。并将其转换回寻找方法 readValue()

以下是您需要使用它的 Maven 工件:

        <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.12.3</version>        
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.12.3</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-jsr310</artifactId>
      <version>2.12.3</version>
    </dependency>
,

我建议您使用 Gson 转换器。它可以帮助您将 Java 类转换为 JSON String。然后您可以使用 String ,就像使用简单文本一样。

您可以导入依赖项:

dependencies {
  implementation 'com.google.code.gson:gson:2.8.7'
}

然后,可以使用jsonschema2pojo来转换JSON:

{ "name": "Test" }

到像这个这样的类:

    package com.example;
    
    import javax.annotation.Generated;
    import com.google.gson.annotations.Expose;
    import com.google.gson.annotations.SerializedName;
    
    public class GreetingRequest {
    
    @SerializedName("name")
    @Expose
    private String name;
    
    public String getName() {
    return name;
    }
    
    public void setName(String name) {
    this.name = name;
    }
    
    }

完成后,您可以在 Java 中执行以下操作:

    Gson converter = new Gson();
    GreetingsRequest request = new GreetingRequest();
    request.setName("Test");
    String greetingsJSON = converter.toJson(request);

然后您仍然可以按如下方式发送 JSON 字符串:

ByteBuf data = ByteBufAllocator.DEFAULT.buffer().writeBytes(greetingsJSON.getBytes());

socket.requestStream(DefaultPayload.create(data,metadata))
        .map(Payload::getDataUtf8)
        .toIterable()
        .forEach(System.out::println);

数据转换

  • JSON 对象 - Java 类
  • 数组 - 列表

有用的链接

,

如果您使用像 Spring Boot 这样的框架,这会为您解决。您可能希望手动控制在哪种情况下其他示例更相关,但 Spring Boot 或 rsocket-rpc 有生产力优势。

https://github.com/rsocket/rsocket-demo/blob/master/src/main/kotlin/io/rsocket/demo/chat/ChatController.kt

https://spring.io/blog/2020/03/02/getting-started-with-rsocket-spring-boot-server

或 rsocket-rpc-java 使用 protobuf 而不是序列化

https://github.com/rsocket/rsocket-rpc-java/blob/master/docs/get-started.md

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。