JAVA串行化(序列化)
假设你想保存一个或多个对象的状态。如果Java不具备串行化能力,就不得不使用某个I/O类写出你想保存的所有对象的实例变量的状态。
串行化简单地说就是“保存这个对象及其所有实例变量Transient,这意味,不会把瞬态变量的值作为对象的串行化状态的一部分包括进来。”。实际上,更有趣的是,显式地将一个变量标识为
将要实现序列化的类必须实现Serializable接口或者是Externalizable接口。
在Serializable接口中没有定义任何方法,而在Externalizable接口中需要实现
public void writeExternal(ObjectOutput out) throws IOException{}以及
public void readExternal(ObjectInput in) throws IOException,ClassNotFoundException{}抽象方法。
一.实现Serializable接口的序列化
/**
*功能:个人信息类
* @author zhangqi
*/
package demo;
import java.io.Serializable;
public class Person implements Serializable
{
privateString name;
privatechar sex;
privateint age;
public Person(String name,char sex,int age)
{
this.name=name;
this.sex=sex;
this.age=age;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public char getSex()
{
return sex;
}
public void setSex(char sex)
{
this.sex = sex;
}
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
public String toString()
{
return getName()+", "+getSex()+", "+getAge();
}
}
/**
*功能:实现对象序列化
* @author Administrator
*/
package demo;
import java.io.*;
public class SerializeTest {
public static void writeO(Person p)
{
try
{
ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream("test.txt"));
oos.writeObject(p);
oos.close();
System.out.println("写入完成!!");
}
catch(Exception e)
{
e.printStackTrace();
}
}
public static void readO()
{
Person p=null;
try
{
ObjectInputStream ois = new ObjectInputStream(
new FileInputStream("test.txt"));
p=(Person)ois.readObject();
System.out.println("读出输出");
System.out.println(p);
ois.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
public static void main(String[] args)
{
Personp1 = new Person("张琦",'男',22);
writeO(p1);
readO();
}
}
当然对于一些敏感数据,不应该将它序列化输出,我们可以在属性前面加上关键字transient,可以让相应的属性不被序列化。
二.实现Externalizable接口实现序列化
在这个类中实现Externalizable接口的两个用于读写属性的方法readExternal()和writeExternal()。通过实现这两个方法,就可以自定义对象的序列化机制。
当从保存了序列化的对象的媒质中读出对象的时候,它会调用类的不带任何参数的默认构造器来构造对象,因此,如果在这个实现Externallizable接口的类中定义类构造器,那么还需要定义一个不带参数的构造器。
/**
* ExternExample.java
*/
package demo;
import java.io.*;
/**
* @author zhangqi
*/
public class ExternExample implements Externalizable{
private String name;
private String creditcard;
private int age;
private double salary;
public ExternExample() {
System.out.println("没有参数的构造器被使用!");
}
public ExternExample(String name,String creditcard,int age,double salary)
{
this.name=name;
this.creditcard=creditcard;
this.age=age;
this.salary=salary;
}
public void writeExternal(ObjectOutput out) throws IOException
{
System.out.println("写入对象...");//本处未对creditcard属性进行序列化。
out.writeObject(name);
out.writeInt(age);
out.writeDouble(salary);
}
public void readExternal(ObjectInput in) throws IOException,ClassNotFoundException
{
System.out.println("读出对象...");
name=(String)in.readObject();
age=in.readInt();
salary=in.readDouble();
}
public String toString()
{
return name+" ,"+age+" ,"+salary;
}
}
/*
* SerializeTest.java
*
*/
package demo;
import java.io.*;
/**
*
* @author zhangqi
*/
public class SerializeTest {
public static void writeO(ExternExample p)
{
try
{
ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream("test.txt"));
oos.writeObject(p);
oos.close();
System.out.println("写入完成!!");
}
catch(Exception e)
{
e.printStackTrace();
}
}
public static void readO()
{
ExternExample p=null;
try
{
ObjectInputStream ois = new ObjectInputStream(
new FileInputStream("test.txt"));
p=(ExternExample)ois.readObject();
System.out.println("读出输出");
System.out.println(p);
ois.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
public static void main(String[] args)
{
ExternExample e1 = new ExternExample("张琦","110107",22,10000);
writeO(e1);
readO();
}
}
分享到:
相关推荐
Java的序列化机制会遍历对象的所有字段,并将它们的值写入字节流。需要注意的是,静态字段和transient修饰的非静态字段不会被序列化。 **二、序列化过程** 1. **对象实例化**:创建一个对象实例。 2. **对象转换**...
### Java序列化详解 在Java开发中,序列化是一个非常重要的概念,它涉及到对象的状态转换为可以存储或传输的形式,并且能够在之后将其恢复为原始形式的过程。本文将深入探讨Java序列化的各个方面,包括其概念、原理...
- **自定义序列化**: 通过实现`writeObject()`和`readObject()`方法,对象可以定义自己的序列化格式。 **二、实现串行化** 在Java中,实现串行化需要让类实现`Serializable`接口。这个接口没有定义任何方法,仅仅...
对象序列化 串行化 实现java对象的保存
在Java编程语言中,`transient`关键字与对象的序列化(serialization)机制密切相关,它在处理对象状态的持久化时扮演着关键角色。本文将深入探讨`transient`关键字的功能、用途以及它如何影响Java对象的序列化过程。 ...
Java 序列化机制 Java 序列化机制是一种将对象状态写入 Byte 流里的技术,并可以从其它地方把该 Byte 流里的数据读出来,重新构造一个相同的对象。这种机制允许将对象通过网络进行传播,并可以随时把对象持久化到...
Java 序列化机制 Java 序列化是将一个对象的状态写入一个 Byte 流里,并且可以从其它地方把该 Byte 流里的数据读出来,重新构造一个相同的对象。这种机制允许你将对象通过网络进行传播,并可以随时把对象持久化到...
Java 序列化机制 Java 序列化是指将一个对象的状态写入一个 Byte 流里,并且可以从其它地方把该 Byte 流里的数据读出来,重新构造一个相同的对象。这种机制允许你将对象通过网络进行传播,并可以随时把对象持久化到...
4. **串行化深度控制**:可以限制序列化深度,防止无限递归和内存消耗。 5. **兼容性**:Kryo提供了版本控制机制,确保在不同版本之间序列化数据的兼容性。 ### Kryo的工作原理 Kryo通过创建一个序列化上下文(`...
接下来,你可以使用`toXML()`方法将Java对象转化为XML字符串,或者使用`fromXML()`方法从XML字符串反序列化回Java对象。 例如,假设我们有一个简单的`Person`类: ```java public class Person { private String ...
下面是一些关于Java串行化的重要知识点: 1. **序列化标识符**:每个可串行化的类都可以包含一个`private static final long serialVersionUID`字段,这个字段用于版本控制。当类的结构发生变化时,如果没有正确...
Java串行化是Java编程语言中的一个重要概念,用于将对象的状态转换为字节流,以便存储在磁盘上或在网络中传输。这个过程被称为对象的序列化,而将字节流恢复为对象的过程称为反序列化。在Java中,实现串行化的主要...
- 对象的序列化顺序必须与反序列化顺序一致,否则可能导致数据恢复错误。 7. **优化与性能** - 对于大对象或频繁访问的数据,考虑使用指针进行串行化,避免复制开销。 - 如果需要节省磁盘空间,可以考虑使用压缩...
串行化/序列化:将java对象转换成某种格式(JVM定义的)的字节数组 串行化使用场景: 将对象用户网络间传输或者是本地化储存。 反串行化:将字节数组恢复成java对象。 package com.yongjun.io; import java.io....
6. **串行化与反串行化的API**:Kryo提供了简洁易用的API,使得开发者可以轻松地将对象序列化到字节数组、输入/输出流或者文件中,并且反序列化回来。 7. **兼容性**:Kryo虽然不是Java标准的序列化机制,但它能很...
Protocol Buffers是Google开发的一种高效的数据序列化协议,它允许开发者将结构化的数据串行化,可用于数据存储、通信协议等方面。Python作为一门广泛使用的编程语言,可以方便地集成protobuf进行数据交换。在本文中...
Java中,我们可以使用Java Serializable接口来标记一个类是可序列化的。序列化不仅可以用于网络传输,还可以用于持久化存储,便于恢复对象状态。例如,客户端发送的消息对象会被序列化成字节流,然后通过网络发送到...
2. 对象串行输入输出:为了实现数据的持久化存储,系统采用了Java的序列化机制。对象串行化将Java对象转换为字节流,然后写入磁盘,形成DAT文件。年级和班级的数据,包括每个班级的成员信息,都在每次操作后被串行化...
所谓的对象序列化(在很多地方也被成为串行化),是指将对象转换成二进制数据流的一种实现手段。通过将对象序列化,可以方便地实现对象的传输及保存。 在Java中提供有ObjectInputStream与ObjectOutputStream这两...
在Java中,序列化是通过ObjectOutputStream的writeObject()方法实现,反序列化则是通过ObjectInputStream的readObject()方法完成。 在实际编程中,处理输入输出流时,我们需要根据具体需求选择合适的流类型。对于...