Моя попытка сериализовать несериализуемый список объектов не работает - PullRequest
0 голосов
/ 22 января 2020

У меня есть сериализуемый класс, который содержит список несериализуемых объектов. Поэтому я пометил этот список как временный и реализовал readObject и writeObject в своем классе. Но когда я сериализую и десериализую свой объект, методы readObject и writeObject не вводятся (я доказал это с помощью sout). Не знаю, почему это не работает. Вот мой код.

Мой сериализуемый класс:

public class Product implements Serializable
{
private String reference;
private String name;
private int stock;
private double defaultPrice;
private transient List<Sale> sales = new ArrayList<>();

public Product(String reference, String name, int stock, double defaultPrice) 
{
    this.reference = reference;
    this.name = name;
    this.stock = stock;
    this.defaultPrice = defaultPrice;

}

public Product() {}

public void addSale(Date from, Date to, int minQuantity, int maxQuantity, double specialPrice)
{
    sales.add(new Sale(from, to, minQuantity, maxQuantity, specialPrice));
}

/*public double findPrice(Date date, int quantity)
{

}*/

public List<Sale> getSales()
{
    return sales;
}

 void writeObject(ObjectOutputStream oos) throws IOException
{
    System.out.println("ENTRO AQUI");
    oos.defaultWriteObject();
    oos.writeInt( sales.size() );
    for(Sale sale: this.sales)
    {

       oos.writeObject( sale.getFrom());
       oos.writeObject( sale.getTo() );
       oos.writeInt( sale.getMinQuantity() );
       oos.writeInt( sale.getMaxQuantity() );
       oos.writeDouble( sale.getSpecialPrice() );
    }
}

public void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException
{
    ois.defaultReadObject();
    int salesSize = ois.readInt();
    for(int i = 0; i < salesSize; ++i)
    {
        Date from = (Date) ois.readObject();
        Date to = (Date) ois.readObject();;
        int minQuantity = (int) ois.readObject();
        int maxQuantity = (int) ois.readObject();
        double specialPrice = (double) ois.readObject();
        Sale sale = new Sale(from, to, minQuantity, maxQuantity, specialPrice);
        this.sales.add(sale);
    }

}

Я не публиковал сеттеры и геттеры, потому что не думаю, что они актуальны.

Мой не сериализуемый класс:

public class Sale 
{
private Date from;
private Date to;
private int minQuantity;
private int maxQuantity;
private double specialPrice;

public Sale(Date from, Date to, int minQuantity, int maxQuantity, double specialPrice) 
{
    this.from = from;
    this.to = to;
    this.minQuantity = minQuantity;
    this.maxQuantity = maxQuantity;
    this.specialPrice = specialPrice;
}

public Sale() {
}

Кстати, это мой читатель:

public class BusinessBinaryReader 
{
public Business read(File file) throws IOException, ClassNotFoundException
{
    try(FileInputStream fis = new FileInputStream( file );
        BufferedInputStream bis = new BufferedInputStream( fis );
        ObjectInputStream ois = new ObjectInputStream( bis )
        )
    {

        return (Business) ois.readObject();
    }
}
}

И мой писатель:

public class BusinessBinaryWriter 
{
public void write(File file, Business business) throws IOException
{
    try(FileOutputStream fos = new FileOutputStream( file );
        BufferedOutputStream bos = new BufferedOutputStream( fos );
        ObjectOutputStream oos = new ObjectOutputStream( bos )
        )
    {
        oos.writeObject(business);
        oos.flush();
    }
}

}

1 Ответ

4 голосов
/ 22 января 2020

Ваши пользовательские функции сериализации readObject и writeObject имеют неправильную подпись. Попробуйте установить их как закрытые, и это должно работать.

Из do c:

Классы, требующие специальной обработки во время процесса сериализации и десериализации, должны реализовать специальные методы с этими точными сигнатурами:

private void writeObject(java.io.ObjectOutputStream out)
 throws IOException

private void readObject(java.io.ObjectInputStream in)
 throws IOException, ClassNotFoundException;

В качестве дополнительного примечания действительно рекомендуется определить SerialVersionUID, особенно если ваши сериализованные объекты являются долгоживущими. Объясненный в этом ответе .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...