java的序列化方式有两种;html
Serializable是经常使用的方法,实现方法为java
class User implements Serializable { private static final long serialVersionUID = -3226152074589523662L; ... }
实现接口,而且最好有序列化ID;ide
Externalizable是Serializable的子类,但不会自动化序列化,须要调用方法实现序列化;函数
打开设置中的检测,而后每次有须要序列化的,生成一个Long型便可加密
Intellij idea用快捷键自动生成序列化ididea
序列化ID也能够是自定义的,好比简单的1L,只要调用方和被调用方约定一致便可;.net
import lombok.*; import lombok.extern.slf4j.Slf4j; import org.testng.annotations.Test; import java.io.*; @Slf4j public class TestTransient { // private static final long serialVersionUID = 8204877978271765366L; @Test public void testTransi(){ User user = new User("andy","123456"); log.info("Before serializable,user={}",user.toString()); try { ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("D:/user.txt")); os.writeObject(user); os.flush(); os.close(); } catch (IOException e) { e.printStackTrace(); } try { ObjectInputStream is = new ObjectInputStream(new FileInputStream("D:/user.txt")); user = (User) is.readObject(); is.close(); log.info("After serializable,username={},pwd={}",user.getUsername(),user.getPassword()); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } @Setter @Getter @AllArgsConstructor @NoArgsConstructor @ToString static class User implements Serializable { private static final long serialVersionUID = -3226152074589523662L; String username; transient String password; } }
注意往一个文件中屡次写入同一个对象的状况code
Java 序列化机制为了节省磁盘空间,具备特定的存储规则,当写入文件的为同一对象时,并不会再将对象的内容进行存储,而只是再次存储一份引用,上面增长的 5 字节的存储空间就是新增引用和一些控制信息的空间。反序列化时,恢复引用关系,使得清单 3 中的 t1 和 t2 指向惟一的对象,两者相等,输出 true。该存储规则极大的节省了存储空间。htm