一个类如想被序列化,是需要实现java.io.Seralizable接口,该接口中没有定义任何方法,是一个标识性接口(Marker Interface),当一个类实现了该接口,就表示这个类的对象是可以序列化的。
transient这个关键字只用在序列化中,将引用的对象标识为transient,则此对象不会被序列化。如下
private transient User ....
在序列化时,static变量是无法被序列化的;如果A包含了对B的引用,那么在序列化A时也会将B一并地序列化;如果此时A可以序列化,B无法序列化,那么当序列化A的时候就会发生异常。这时就需要将对B的引用设为transient。该关键字表示变量不会被序列化。
package com.test.io;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class SerializableTest {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//序列化
Person p1 = new Person(21,"zhangsan",1.61);
Person p2 = new Person(23,"lisi",1.75);
Person p3 = new Person(22,"hp",1.70);
FileOutputStream fos = new FileOutputStream("person.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(p1);
oos.writeObject(p2);
oos.writeObject(p3);
oos.close(); //只需要关闭最外层
System.out.println("--------------");
//反序列化
FileInputStream fis = new FileInputStream("person.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
Person p = null;
for (int i = 0; i < 3; i++) {
p = (Person) ois.readObject();
System.out.println("name ="+p.name+" age = "+p.age+" height = "+p.height);
}
ois.close();
}
}
class Person implements Serializable{
int age;
transient String name; //transient定义的变量不会被序列化
double height;
public Person(int age,String name,double height) {
this.age = age;
this.name = name;
this.height = height;
}
}
打印结果为
由于name是transient的,所以不会被序列化。
实现上述两个方法后,序列化与反序列化则完成类自身来控制。
package com.test.io;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class SerializableTest2 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//序列化
Person2 p1 = new Person2(21,"zhangsan",1.61);
Person2 p2 = new Person2(23,"lisi",1.75);
Person2 p3 = new Person2(22,"hp",1.70);
FileOutputStream fos = new FileOutputStream("Person2.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(p1);
oos.writeObject(p2);
oos.writeObject(p3);
oos.close(); //只需要关闭最外层
System.out.println("--------------");
//反序列化
FileInputStream fis = new FileInputStream("Person2.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
Person2 p = null;
for (int i = 0; i < 3; i++) {
p = (Person2) ois.readObject();
System.out.println("name ="+p.name+" age = "+p.age+" height = "+p.height);
}
ois.close();
}
}
class Person2 implements Serializable{
int age;
transient String name; //transient定义的变量不会被序列化
double height;
public Person2(int age,String name,double height) {
this.age = age;
this.name = name;
this.height = height;
}
private void writeObject(ObjectOutputStream oos) throws IOException{
System.out.println("write object");
oos.writeInt(this.age);
oos.writeUTF(this.name);
}
private void readObject(ObjectInputStream ois) throws IOException{
System.out.println("read object");
this.age = ois.readInt();
this.name = ois.readUTF();
}
}
当我们在一个待序列化/反序列化的类中实现了上面两个private方法(方法声明要与上面的保持一致),那么就允许我们以更加底层,更加细粒度的方式序列化/反序列化的过程。
分享到:
相关推荐
Vbs序列化/反序列化Json基类 可直接使用,bug已被我修复 Example: Dim fso, json, str, o, i Set json = New VbsJson Set fso = WScript.CreateObject("Scripting.Filesystemobject") str = fso.OpenTextFile(...
持久性和文件I/O是程序保持和记录数据的一种重要方法,这两种不同的处理方法虽然功能上有些接近但实现过程却大不相同。
BufferedReader FileInputStream FileReader java序列化 java I/O流操作
简单来说序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化,流的概念这里不用多说(就是I/O),我们可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间(注:要想将对象...
Avro是一个数据序列化系统,设计用于支持大 批量数据交换的应用。它的主要特点有:支持二进制序列化方式,可以便捷,快速地处理大量数据;动态语言友好,Avro提供的机制使动态语言可以方便地处理 Avro数据。 ...
所有KOR库
一些关于VC中文档序列化与文件输入输出的总结
详情见:https://blog.csdn.net/qq_37651267/article/details/90048289
.NET体系结构内容小结第2章 托管执行环境的介绍第3章 使用组件第4章 部署与版本控制第5章 对象和类型第7章 数组和集合第8章 委托和事件第9章 内存管理第10章 文件与I/O流以及序列化第11章 线程第12章 访问Internet第...
泛型 Java 泛型了解么?...I/O 什么是序列化?什么是反序列化? Java 序列化中如果有些字段不想进行序列化,怎么办? 获取用键盘输入常用的两种方法 Java 中 IO 流分为几种? 既然有了字节流,为什么还要有字符流?
罗克韦尔全球环境下的高速序列化zip,全球环境下的高速序列化,工业 PC 与 Allen-Bradley? 可编程自动化控制 器相连,用于控制生产线中所有打印机与摄 像机的打印与检验、所有附加 I/O 和其它传 感器,例如 RFID。
i++) //求出序列第k至第m个元素的值 { sum=0; for(j=i-k;j<i;j++) sum+=temp[j]; temp[i]=sum; } f=temp[m]; } return OK; }//fib 分析:通过保存已经计算出来的结果,此方法的时间复杂度仅为O(m^2).如果采用...
man子手文件I / O和序列化
i++) //求出序列第k至第m个元素的值 { sum=0; for(j=i-k;j<i;j++) sum+=temp[j]; temp[i]=sum; } f=temp[m]; } return OK; }//fib 分析:通过保存已经计算出来的结果,此方法的时间复杂度仅为O(m^2).如果采用...
InitializeComponent ( :i /通过Udp协议广播数据 private void btnSendUdp_click(object sender,EventArgs e){ Socket socket = new Socket(AddressFamily.InterNet work,SocketType.Dgram,...1/将对象序列化到内存
i++) //求出序列第k至第m个元素的值 { sum=0; for(j=i-k;j<i;j++) sum+=temp[j]; temp[i]=sum; } f=temp[m]; } return OK; }//fib 分析:通过保存已经计算出来的结果,此方法的时间复杂度仅为O(m^2)...
MySQL JDBC反序列化有效负载/ MySQL客户端jdbc反序列化漏洞描述当MySQL JDBC url可控时,除能利用MySQL协议读取MySQL客户端的本地文件之外,还可以利用客户端在连接服务器时会反序列化服务器返回的二进制数据,从而...
序列化(Serializable) 将对象写到流中并将其读回的过程 接口(interface) 只声明方法而不实现,数据成员必须初始化且不能更改的特殊类 抽象类(abstract class) 仅定义了方法的部分实现,而留待扩展类去提供这些方法...
- **输入输出(I/O)**:文件读写、序列化、NIO(New I/O)。 推荐资源: - **书籍**:《Java编程思想》 (Thinking in Java) by Bruce Eckel - **在线教程**:Codecademy的Java课程,Java 官方教程
用于序列化和反序列化JSON数据。 5. Java I/O 基于Java I/O操作 6. UUID类 避免文件名冲突 7. Lombok库 8. HTTP状态码管理 注意: 请注意,这个例子假设目标API接受名为"fileupload"的字段作为文件内容,并且不...