【问题标题】:I want to serialize and deserialize a ArrayList<Employee> but I keep getting warning?我想序列化和反序列化 ArrayList<Employee> 但我不断收到警告?
【发布时间】:2014-06-27 11:33:17
【问题描述】:

我想将ArrayEmployees 序列化和反序列化到文件中和从文件中取出。

我在编译和运行时不断收到类型安全警告。

有没有比我做的更好的方法来做到这一点。我希望能够将条目ArrayList 写入序列化文件,然后将其发送给某人并让他们能够对其进行反序列化。

问题:如何摆脱未经检查的类型安全性代码?

警告:

Type safety: Unchecked cast from Object to ArrayList<Employee>

代码:

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 TestSer implements java.io.Serializable {
    private static final long serialVersionUID = 1L;
    ArrayList<Employee> eee = new ArrayList<Employee>();
    ArrayList<Employee> newEmp = new ArrayList<Employee>();

    private void readSerFile() {

          try
          {
             FileInputStream fileIn = new FileInputStream("C:\\Users\\itpr13266\\Desktop\\test.ser");
             ObjectInputStream in = new ObjectInputStream(fileIn);
             newEmp = (ArrayList<Employee>) in.readObject();
             in.close();
             fileIn.close();
          } catch(IOException i) {
             i.printStackTrace();
             return;
          }catch(ClassNotFoundException c) {
             System.out.println("Employee class not found");
             c.printStackTrace();
             return;
          }

          for (Employee ee : eee) { 
              System.out.println("Deserialized Employee...");
              System.out.println("Name:                   " + ee.name);
              System.out.println("Address:                " + ee.address);
              System.out.println("SSN:                    " + ee.SSN);
              System.out.println("Number:                 " + ee.number);   
          }
    }

    private void writeSer() {
        for (int i=0; i < 10; i++) {
            eee.add(new Employee("Name" + Integer.toString(i), "Test Address", 12345678));
        }

        try
        {
           FileOutputStream fileOut = new FileOutputStream("C:\\Users\\itpr13266\\Desktop\\test.ser");
           ObjectOutputStream out   = new ObjectOutputStream(fileOut);
           out.writeObject(eee);
           out.close();
           fileOut.close();
           System.out.printf("Serialized data is saved in /tmp/employee.ser");
        } catch(IOException i) {
            i.printStackTrace();
        }   
    }

    public static void main(String [] args) {
        TestSer tempObject = new TestSer();
        tempObject.writeSer();
        System.out.println("---");
        tempObject.readSerFile();
    }

}

class Employee implements java.io.Serializable
{
    Employee(String n, String a, int number) {
        this.name = n;
        this.address = a;
        this.number = number;
    }

   private static final long serialVersionUID = 1L;
   public String name = "";
   public String address = "";
   public transient int SSN = 0;
   public int number = 0;

   public void mailCheck() {
      System.out.println("Mailing a check to " + name + " " + address);
   }
}

【问题讨论】:

    标签: java file serialization io


    【解决方案1】:

    您唯一的选择是使用@SuppressWarnings("unchecked") 注释。

    【讨论】:

    • 如果我将声明更改为 Object newEmp = new ArrayList();然后取消类型检查错误消失。那是因为 Object 实际上可以是您想要的任何东西吗?
    • 如果你想仔细检查输入(仔细检查输入总是一个好主意),你可以遍历列表并检查它的每个元素是instanceof Employee
    • 没错,而另一种情况则相反,因为您需要显式转换。
    • 你能举个简单的例子吗?
    • 但是如果你从Object 转到ArrayList&lt;Type&gt;,你实际上会得到一个ArrayList&lt;Type&gt; 对象,对吗?如果我确定我的目标已经实现,我会更好地抑制警告。 ;)
    猜你喜欢
    • 2019-03-17
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-15
    • 2013-05-07
    相关资源
    最近更新 更多