如何序列化要通过 Java RSocket 发送的 POJO?
How to serialise a POJO to be sent over a Java RSocket?
我正在尝试通过 RSocket 请求流发送 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);
我推荐你使用 Gson 转换器。它可以帮助您将 Java Class 转换为 JSON String。然后您可以像处理简单文本一样处理 String。
可以导入依赖:
dependencies {
implementation 'com.google.code.gson:gson:2.8.7'
}
然后,可以使用jsonschema2pojo来转换JSON:
{ "name": "Test" }
到class像这个:
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 class
- 数组 - 列表<>
有用的链接:
这是您需要 include(包含教程)在 Java 中的库:GSON Converter Git
这是一个JSON到Class在线转换器:Jsonschema2pojo generator
有一种本机 java 序列化机制,我不推荐,但您可以阅读它。阅读 Java API 中的 Serialazable 界面。我会推荐 2 个选项:
- JSON-JACKSON(也称为 Faster XML)
- GSON(在 César Ferreira 的回答中提到)
两者都将 classes 转换为 JSON,反之亦然。对于 JSON-JACKSON,请参阅 class 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>
如果您使用 Spring Boot 这样的框架,系统会为您处理。在其他示例更相关的情况下,您可能想要手动控制,但 Spring Boot 或 rsocket-rpc 可以提高工作效率。
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
我正在尝试通过 RSocket 请求流发送 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);
我推荐你使用 Gson 转换器。它可以帮助您将 Java Class 转换为 JSON String。然后您可以像处理简单文本一样处理 String。
可以导入依赖:
dependencies {
implementation 'com.google.code.gson:gson:2.8.7'
}
然后,可以使用jsonschema2pojo来转换JSON:
{ "name": "Test" }
到class像这个:
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 class
- 数组 - 列表<>
有用的链接:
这是您需要 include(包含教程)在 Java 中的库:GSON Converter Git
这是一个JSON到Class在线转换器:Jsonschema2pojo generator
有一种本机 java 序列化机制,我不推荐,但您可以阅读它。阅读 Java API 中的 Serialazable 界面。我会推荐 2 个选项:
- JSON-JACKSON(也称为 Faster XML)
- GSON(在 César Ferreira 的回答中提到)
两者都将 classes 转换为 JSON,反之亦然。对于 JSON-JACKSON,请参阅 class 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>
如果您使用 Spring Boot 这样的框架,系统会为您处理。在其他示例更相关的情况下,您可能想要手动控制,但 Spring Boot 或 rsocket-rpc 可以提高工作效率。
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