• Java List序列化的实现


    概述
    java中的序列化与反序列化都要求对象实现Serializable接口(其实就是声明一下),而对于List这种动态改变的集合默认是不实现这个接口的,也就是不能直接序列化。但是数组是可以序列化的,所以我们只需要将List集合与数组进行转换就可以实现序列化与反序列化了。

    序列化
    Object对象

    public class TestObject implements Serializable{

    private String name;
    private String address;

    public String getName() {
    return name;
    }
    public void setName(String name) {
    this.name = name;
    }
    public String getAddress() {
    return address;
    }
    public void setAddress(String address) {
    this.address = address;
    }

    }

    实例化对象,加点数据,然后执行序列化

    public class Test {

    public static void main(String[] args)
    {
    //创建要序列化的集合对象
    List<TestObject> list = new ArrayList<>();
    //加数据
    for (int i = 0; i < 5; i++)
    {
    TestObject testObject = new TestObject();
    testObject.setName("MJJ-"+i);
    testObject.setAddress("HangZhou");
    list.add(testObject);
    }

    File file = new File("object.adt");
    try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(file)))
    {
    //将List转换成数组
    TestObject[] obj = new TestObject[list.size()];
    list.toArray(obj);
    //执行序列化存储
    out.writeObject(obj);
    }
    catch (IOException e)
    {
    e.printStackTrace();
    }
    }
    }


    反序列化
    public class Test {

    public static void main(String[] args)
    {
    File file = new File("object.adt");
    try (ObjectInputStream out = new ObjectInputStream(new FileInputStream(file)))
    {
    //执行反序列化读取
    TestObject[] obj = (TestObject[]) out.readObject();
    //将数组转换成List
    List<TestObject> listObject = Arrays.asList(obj);
    }
    catch (IOException e)
    {
    e.printStackTrace();
    }
    catch (ClassNotFoundException e)
    {
    e.printStackTrace();
    }
    }
    }


    封装
    利用泛型把序列化和反序列化的方法封装起来,方便使用。

    工具类
    public class StreamUtils {

    /**
    * 序列化,List
    */
    public static <T> boolean writeObject(List<T> list,File file)
    {
    T[] array = (T[]) list.toArray();
    try(ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(file)))
    {
    out.writeObject(array);
    out.flush();
    return true;
    }
    catch (IOException e)
    {
    e.printStackTrace();
    return false;
    }
    }

    /**
    * 反序列化,List
    */
    public static <E> List<E> readObjectForList(File file)
    {
    E[] object;
    try(ObjectInputStream out = new ObjectInputStream(new FileInputStream(file)))
    {
    object = (E[]) out.readObject();
    return Arrays.asList(object);
    }
    catch (IOException e)
    {
    e.printStackTrace();
    }
    catch (ClassNotFoundException e)
    {
    e.printStackTrace();
    }
    return null;
    }
    }


    使用工具类
    //序列化
    StreamUtils.<TestObject>writeObject(list, new File("object.adt"));
    //反序列化
    List<TestObject> re = StreamOfByte.<TestObject>readObjectForList(new File("object.txt"));
    ---------------------
    作者:M家杰
    来源:CSDN
    原文:https://blog.csdn.net/tyzlmjj/article/details/50332815
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    jquery实现“上一页、下一页及第一页”操作的无刷算法
    $ ssh -T git@github.com ssh: connect to host ssh.github.com port 22: Connection timed out
    git clone fatal: unable to access 'https://github.com/carlon/demo.git/': Failed to connect to github.com port 443: Timed out
    ESLint
    JS中的对象之原型
    JS中的Promise
    使用过Fetch之后,你还想使用AJAX吗
    Redux中的异步操作
    React全家桶之一 react-router之高级
    React 实践心得:react-redux 之 connect 方法详解
  • 原文地址:https://www.cnblogs.com/renjiaqi/p/10403783.html
Copyright © 2020-2023  润新知