• Java:序列化


    什么是Java对象序列化

    1.永久性保存对象,保存对象的字节序列到本地文件中;

    2.通过序列化对象在网络中传递对象;

    3.通过序列化在进程间传递对象。

    注意

    1.被序列化的类必须实现java.io.Serializable接口

    2.在序列化过程能中不要改变数据的状态 <可以序列化非线程安全的类,但在序列化过程中这个类必须是线程安全的>:

       之前遇到过EOFException这个异常,是在读取序列化文件的时候抛出来的,网上找贴回答都是意外结尾,意外开头,什么结尾追加输出null,扯了一大堆,看的我也是醉了。

        想吐槽的就是,序列化接口是人家给的,输出接口也是人家给的,抛异常肯定就是序列化过程中输出数据出了问题,丫在结尾加个null怎么就管用了。

        最后发现是我在序列化一个MAP的时候还在往这个MAP里面put数据,导致序列化文件的时候数据出了问题,读取的时候抛了异常。

        <序列化接口具体的后代代码我也没看,来个高人帮忙分析分析?>

    贴代码:

       #进程间通信 <流写到其他机器上去就是网络中传递对象,写到本地磁盘就是序列化到本地>

       

    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.io.Serializable;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.net.UnknownHostException;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Map.Entry;
    import java.util.Set;
    class Client1 {
    public static void main(String[] args) throws UnknownHostException, IOException, InterruptedException {
    Socket s = new Socket("localhost", 30000);
    ObjectInputStream in = new ObjectInputStream(s.getInputStream());
    try {
    Map<String, MyClass1> data = (Map)in.readObject();
    int i=1;
    for(Entry<String, MyClass1> e:data.entrySet())
    {
    System.out.println("反序列化第"+i+++"对象:");
    System.out.println(e.getKey()+":"+e.getValue().getAge()+","+e.getValue().getWeight());
    }
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    }
    }
    }

    public class Server {
    public static void main(String[] args) throws IOException{
    ServerSocket srv = new ServerSocket(30000);//port
    while(true) {
    Socket s = srv.accept();
    //创建一个对象输出流
    ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());
    //要发送到client的Map对象
    Map<String, MyClass1> data = new HashMap<String, MyClass1>();
    for(int i=0;i<1000;i++)
    { MyClass1 c =new MyClass1(i,i);
    data.put("编号:"+i, c);
    }
    out.writeObject(data);
    out.flush();
    out.close();
    //同时输出到文件
    FileOutputStream fos = new FileOutputStream("catDemo.out");
    ObjectOutputStream oos = new ObjectOutputStream(fos);
    oos.writeObject(data);
    oos.close();
    }
    }
    }
    //自定义对象, 必须实现可序列化接口
    class MyClass1 implements Serializable{
    /**
    *
    */
    private static final long serialVersionUID = 1L;
    private int weight;
    private int age;

    public MyClass1(int weight, int age){
    setWeight(weight);
    setAge(age);
    }

    public int getWeight() {
    return weight;
    }
    public void setWeight(int weight) {
    this.weight = weight;
    }
    public int getAge() {
    return age;
    }
    public void setAge(int age) {
    this.age = age;
    }
    }

  • 相关阅读:
    自定义的事件管理器
    解决修改表结构,添加外键时出现“约束冲突”的错误
    jQuery学习(二) 自定义扩展函数
    iBt(001-004)原文与试译
    老婆怀孕了!(5+6)
    Mac_如何打开系统文件library
    Mac_如何通过命令行装包到ios手机
    MAC干净卸载pycharm
    selenium自动化_如何启动safari浏览器
    selenium自动化_click方法点击无效
  • 原文地址:https://www.cnblogs.com/architects/p/4213626.html
Copyright © 2020-2023  润新知