【问题标题】:Deserialize ArrayList: [unchecked] unchecked conversion required: ArrayList<Employee> found: ArrayList反序列化 ArrayList:[unchecked] 需要未经检查的转换:ArrayList<Employee> 找到:ArrayList
【发布时间】:2019-12-01 13:26:59
【问题描述】:

我正在尝试对 java 应用程序进行序列化和反序列化。它正在工作,但我想知道我是否正确地执行了这个过程。我正在序列化 ArrayList;这是正确的方法还是我应该序列化 Employee 类,但是考虑到我们可以有很多员工,我该怎么做呢?

我这样做的方式会导致我想摆脱这个错误:

serialTest.java:40: 警告:[unchecked] 未经检查的转换 员工 = (ArrayList) ois.readObject();必需:找到 ArrayList:ArrayList 1 警告

这是 Employee 类: 包序列测试; 导入 java.io.Serializable;

public class Employee implements Serializable {

    int id;
    String firstName;
    String lastName;

    public Employee(int id, String firstName, String lastName) {
        super();
        this.id = id;
        this.firstName = firstName;
        this.lastName = lastName;
    }

    @Override
    public String toString() {
        return "Employee [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + "]";
    }
}

这里是主类:

package serialTest;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;

public class serialTest {

    static ArrayList<Employee> employees = new ArrayList<>();

    public static void main(String[] args) {
        if (args.length > 0) {
            deSerialize();
        } else {
            employees.add(new Employee(1, "John", "Doe"));
            employees.add(new Employee(2, "Jane", "Doe"));
            serialize();
        }
    }

    private static void serialize() {
        System.out.println("Serializing...");
        try {
            try (FileOutputStream fos = new FileOutputStream("employeeData"); ObjectOutputStream oos = new ObjectOutputStream(fos)) {
                oos.writeObject(employees);
            }
        } catch (IOException ioe) {
        }
    }

    private static void deSerialize() {
        System.out.println("DeSerializing...");
        try {
            try (FileInputStream fis = new FileInputStream("employeeData");
                    ObjectInputStream ois = new ObjectInputStream(fis)) {

                employees = (ArrayList) ois.readObject();

            }
        } catch (IOException ioe) {
            System.out.println("File problems");
            return;
        } catch (ClassNotFoundException c) {
            System.out.println("Class problems");
            return;
        }

        for (Employee info : employees) {
            System.out.println(info);
        }
    }
}

【问题讨论】:

  • 在将结果从ois.readObject() 转换为ArrayList 时使用原始类型
  • 如果我这样做也会发生同样的事情:employees = (ArrayList&lt;Employee&gt;) ois.readObject();

标签: java arraylist serialization deserialization


【解决方案1】:

您将不得不取消该警告。由于类型擦除,Java 不知道实际的泛型类型。

【讨论】:

  • 禁止警告?这不是一个可以接受的答案。我不想压制警告。我想要解决这个问题。
  • 嗯,没有其他解决方案,所以这是一个可以接受的答案。如果您自己对类型擦除进行一些研究,您会发现。不是你想要的一切都是可能的,习惯吧。
【解决方案2】:

我想出了一个解决方案。会很感激一些cmets。

package serialTest;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Arrays;

public class serialTest {

    static ArrayList<Employee> employees = new ArrayList<>();

    public static void main(String[] args) {
        if (args.length > 0) {
            deSerialize();
        } else {
            employees.add(new Employee(1, "John", "Doe"));
            employees.add(new Employee(2, "Jane", "Doe"));
            serialize();
        }
    }

    private static void serialize() {
        System.out.println("Serializing...");
        try {
            try (FileOutputStream fos = new FileOutputStream("employeeData"); 
                    ObjectOutputStream oos = new ObjectOutputStream(fos)) {
                oos.writeObject((Employee[]) employees.toArray(new Employee[employees.size()]));
            }
        } catch (IOException ioe) {
        }
    }

    private static void deSerialize() {
        System.out.println("DeSerializing...");
        try {
            try (FileInputStream fis = new FileInputStream("employeeData");
                    ObjectInputStream ois = new ObjectInputStream(fis)) {

                employees.addAll(Arrays.asList((Employee[]) ois.readObject()));
            }
        } catch (IOException ioe) {
            System.out.println("File problems");
            return;
        } catch (ClassNotFoundException c) {
            System.out.println("Class problems");
            return;
        }

        for (Employee info : employees) {
            System.out.println(info);
        }
    }
}

【讨论】:

  • 这是一种解决方法,对我下面的解决方案没有实际优势。如果被反序列化的对象是例如List&lt;String&gt; 而不是 List&lt;Employee&gt;。 Java 无法在运行时验证这一点。
猜你喜欢
  • 2019-07-12
  • 2016-01-19
  • 1970-01-01
  • 2012-10-13
  • 2013-05-07
  • 2011-09-05
  • 1970-01-01
  • 2015-03-02
  • 1970-01-01
相关资源
最近更新 更多