簡體   English   中英

通過消息隊列進行序列化和反序列化

[英]Serialization and Deserialization through message queue

我有一個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

我在兔子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
    }
}

從一個單獨的春季啟動應用程序,我試圖使用員工列表。 在消費者應用程序中,我具有相同的員工類結構。 然而,包裝是不同的。

package org.springboot.consumer.model;

import java.io.Serializable;

public class Employee implements Serializable{
    //fields and getters-setters here
}

簡而言之,消費者代碼如下:

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();
        }

    }

}

但我得到以下例外:

java.lang.ClassNotFoundException: com.mypackage.rabbitmq.model.Employee

它似乎是序列化和反序列化問題。

我的問題是:

  1. 如果我發布Employee而不是List,我甚至不需要序列化該類。 那么為什么我需要在List的情況下序列化?
  2. 為什么這個例外? 我們是否需要在兩端為序列化類維護相同的包結構?
  3. 在消費者方面,我們需要有serialVersionUID嗎? 如果是,它是否應該與出版商的那一方相符?

提前致謝。

1)雖然java.util.List不是Serializable,但所有標准實現都是,所以你應該能夠序列化/反序列化ArrayList。

2)是的,你需要在同一個包中使用相同的類,並且..

3)兩端的類必須具有相同的serialVersionUID

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM