Ani*_*n B 3 java serialization rabbitmq deserialization spring-boot
我有一个Employee类如下:
package com.mypackage.rabbitmq.model
import java.io.Serializable;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Employee implements Serializable{
/**
*
*/
private static final long serialVersionUID = -2736911235490297622L;
private int EmpNo;
private String FirstName;
private String LastName;
private int age;
private String gender;
private String skill;
private long phone;
private String email;
private double salary;
//getters and setters
Run Code Online (Sandbox Code Playgroud)
我在rabbit MQ中发布了员工名单如下:
package com.mypackage.rabbitmq.client.publisher;
//imports
public class Publisher {
public static void main(String[] args) throws IOException {
ConnectionFactory factory = new ConnectionFactory();
Connection con = factory.newConnection("localhost");
Channel channel = con.createChannel();
Gson gson = new GsonBuilder().create();
Employee employee = null;
List<Employee> empList = new ArrayList<>();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
String queueName = "TestQueue";
for(int i=1; i<=10; i++){
employee = newEmp(i);
String message =gson.toJson(employee);
System.out.println("queueName: "+queueName);
empList.add(employee);
}
oos.writeObject(empList);
channel.basicPublish(1, "", queueName, null, bos.toByteArray());
System.out.println("[X], sent '"+empList+"'");
channel.close(0, queueName);
con.close(0, queueName);
}
public static Employee newEmp(int i){
//logic here
}
}
Run Code Online (Sandbox Code Playgroud)
从一个单独的 Spring Boot 应用程序中,我尝试使用员工列表。在消费者应用程序中,我有相同的员工类结构。但是包不一样。
package org.springboot.consumer.model;
import java.io.Serializable;
public class Employee implements Serializable{
//fields and getters-setters here
}
Run Code Online (Sandbox Code Playgroud)
简而言之,消费者代码如下:
public class SDPRabbitMQConsumer implements MessageListener {
@Override
public void onMessage(Message message) {
Gson gson = new GsonBuilder().create();
try {
ByteArrayOutputStream os = new ByteArrayOutputStream();
os.write(message.getBody(), 0, message.getBody().length);
ByteArrayInputStream is = new ByteArrayInputStream(os.toByteArray());
ObjectInputStream objInputStream = new ObjectInputStream(is);
System.out.println("objInputStream.readObject().toString()"+objInputStream.readObject().toString());
Employee[] employeeArray = gson.fromJson(objInputStream.readObject().toString(), Employee[].class);
List<Employee> employeeList = new ArrayList<Employee>(Arrays.asList(employeeArray));
for(Employee employee: employeeList){
System.out.println(employee);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
但我收到以下异常:
java.lang.ClassNotFoundException: com.mypackage.rabbitmq.model.Employee
Run Code Online (Sandbox Code Playgroud)
似乎这是一个序列化和反序列化问题。
我的问题是:
提前致谢。
1) 虽然 java.util.List 不是 Serializable,但所有标准实现都是,因此您应该能够序列化/反序列化 ArrayList 例如。
2)是的,你需要在同一个包中的同一个类,而且..
3)两端的类必须有相同的serialVersionUID
| 归档时间: |
|
| 查看次数: |
5297 次 |
| 最近记录: |