java的IO中提供了一个 ObjectOutputStream对象,其中的方法writeObject()文档如下:
/**
* Write the specified object to the ObjectOutputStream. The class of the
* object, the signature of the class, and the values of the non-transient
* and non-static fields of the class and all of its supertypes are
* written. Default serialization for a class can be overridden using the
* writeObject and the readObject methods. Objects referenced by this
* object are written transitively so that a complete equivalent graph of
* objects can be reconstructed by an ObjectInputStream.
*
* <p>Exceptions are thrown for problems with the OutputStream and for
* classes that should not be serialized. All exceptions are fatal to the
* OutputStream, which is left in an indeterminate state, and it is up to
* the caller to ignore or recover the stream state.
*
* @throws InvalidClassException Something is wrong with a class used by
* serialization.
* @throws NotSerializableException Some object to be serialized does not
* implement the java.io.Serializable interface.
* @throws IOException Any exception thrown by the underlying
* OutputStream.
*/
public final void writeObject(Object obj) throws IOException {
}
简要的翻译就是“将指定的对象写到输出流”。其实这个方法的文档有些误导的意思,下面这个例子我们会发现,这个方法甚至可以直接序列化集合,如List,Array等。
例子引用自http://blog.csdn.net/hdAptechIvan/
首先建立2个对象,
package serialization;
import java.io.Serializable;
class Employee implements Serializable
{
/**
*
*/
private static final long serialVersionUID = -316102412618444933L;
public Employee(String n, double s)
{
name = n;
salary = s;
}
/**
*加薪水
*/
public void raiseSalary(double byPercent)
{
double raise = salary * byPercent / 100;
salary += raise;
}
public String toString()
{
return getClass().getName()
+ "[name = "+ name
+ ",salary = "+ salary
+ "]";
}
private String name;
private double salary;
}
package serialization;
class Manager extends Employee
{
public Manager(String n, double s)
{
super(n, s);
secretary = null;
}
/**
*设置秘书
*/
public void setSecretary(Employee s)
{
secretary = s;
}
public String toString()
{
return super.toString()
+ "[secretary = "+ secretary
+ "]";
}
//secretary代表秘书
private Employee secretary;
}
然后直接序列化集合到文件,并通过读取文件,修改数据来验证序列化是成功的:
package serialization;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
/**
* 对象的序列化
*
*/
public class Test
{
public static void main(String[] args)
{
Employee harry = new Employee("Harry Hacker", 50000);
Manager manager1 = new Manager("Tony Tester", 80000);
manager1.setSecretary(harry);
List<Employee> staff = new ArrayList<Employee>(2);
staff.add(harry);
staff.add(manager1);
//数组也可以
// Employee[] staff = new Employee[2];
//
// staff[0] = harry;
// staff[1] = manager1;
try
{
ObjectOutputStream out = new ObjectOutputStream(
new FileOutputStream("employee.dat"));
out.writeObject(staff); //!!!!!!这个方法可以写集合、数组
out.close();
ObjectInputStream in = new ObjectInputStream(
new FileInputStream("employee.dat"));
List<Employee> newStaff = (List<Employee>)in.readObject();
in.close();
/**
*通过harry对象来加薪
*将在secretary上反映出来
*/
newStaff.get(0).raiseSalary(10);
for (int i = 0; i < newStaff.size(); i++)
System.out.println(newStaff.get(i));
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
分享到:
相关推荐
以下是一个简单的示例,展示了如何使用`ObjectToXMLUtil`工具类将Java对象序列化到XML文件以及从XML文件中反序列化: ```java public class Test { public static void main(String[] args) { // 创建一个示例...
- **序列化与反序列化**:将对象序列化为字节数组,然后再反序列化为新的对象,实现深拷贝。 3. **注解实现对象复制** - **Apache Commons BeanUtils库**:提供了`BeanUtils.copyProperties()`方法,可以快速实现...
XStream是一个强大的库,它允许开发者以XML格式进行序列化和反序列化Java对象。在这个场景中,我们将深入探讨如何使用XStream处理对象的序列化和反序列化。 首先,让我们了解什么是XStream。XStream是由Joe Walnes...
极好的序列化与发序列化代码。可以处理array集合,数组或者单个对象等的序列化与反序列化。
JSON是一种轻量级的数据交换格式,它允许我们将Java对象转换为JSON字符串,反之亦然,方便在网络间传输或者保存在文件系统中。本篇文章将深入探讨Java中JSON的序列化与反序列化,以及相关的工具库。 一、JSON概述 ...
总的来说,Java对象集合转JSON格式是通过JSON库实现的,而Jackson是其中最常用的一个。理解这一过程有助于提升你在处理数据转换时的效率和灵活性。通过深入学习和实践,你还可以掌握更多高级特性,如类型绑定、注解...
例如,它可能会利用` CommonsCollections`框架的一个已知漏洞,该漏洞允许攻击者通过构造特殊的集合序列化对象来执行命令。 要使用ysoserial,首先需要解压ysoserial_master.zip,然后通过Java编译和运行其源码。它...
`HashTable`,作为Java中的一个内置集合类,也可以被序列化。`HashTable`继承自`Dictionary`类,并实现了`Serializable`接口,因此它支持序列化操作。 要序列化一个`HashTable`对象,我们需要执行以下步骤: 1. ...
Java SE编程入门教程 java序列化(共14页).pptx Java SE编程入门教程 java异常(共57页).pptx Java SE编程入门教程 java正则(共8页).pptx Java SE编程入门教程 properties(共3页).pptx Java SE编程入门教程 ...
标题 "GSON实现Java对象的JSON序列化与反序列化的实例教程" 所指示的知识点主要围绕GSON库及其在Java对象与JSON格式数据之间的相互转换。 知识点一:GSON简介 GSON是由Google开发的一个用于在Java对象和JSON数据...
Java对象与XML之间的相互序列化是软件开发中常见的任务,特别是在数据交换、持久化或配置存储等场景。XML4J是一个用于Java对象到XML转换的工具,它提供了方便的方法将Java对象序列化为XML文档,同时也能从XML文档中...
首先,Java序列化是将一个对象转换为字节流的过程,目的是为了持久化数据或者在网络中传输对象。当一个类需要被序列化时,它需要实现`java.io.Serializable`接口。这个接口是一个标记接口,没有定义任何方法,但它的...
Java集合、多线程以及序列化是Java编程中不可或缺的基础概念。这些技术广泛应用于各种复杂的系统设计和开发中,理解并熟练掌握它们对于提升Java程序员的技能至关重要。 首先,我们来详细探讨Java集合。Java集合框架...
Java Architecture for XML Binding (JAXB) 是Java平台中用于处理XML和Java对象之间转换的一个标准API。它使得在Java应用程序中使用XML数据变得更加方便,无需手动编写大量的转换代码。本教程将详细介绍JAXB如何实现...
13. **I/O流**:Java的I/O流系统支持数据的输入和输出,包括字符流和字节流,以及过滤流、缓冲流、对象序列化等高级功能。 14. **反射**:反射机制允许程序在运行时动态获取类的信息(如类名、方法名等)并调用方法...
在`json-lib`中,序列化是指将Java对象转换成JSON字符串的过程,而反序列化则是将JSON字符串转换回Java对象。以下是对这两个过程的详细说明: 1. **序列化**: - 使用`json-lib`,你可以通过`...
在Java或C#等面向对象的语言中,序列化常用于将对象转换为字节流,以便存储在磁盘上或通过网络发送。序列化可以帮助我们保存应用程序的状态,使程序在下次启动时能够恢复到之前的状态。它也适用于分布式系统,如Web...
通过自定义反序列化方法,我们可以灵活地处理各种复杂的数据映射需求,将JSON数据准确无误地转换成Java对象,以供后端业务逻辑处理。这一过程不仅涉及到Java反射机制的运用,同时也需要对JSON格式有深入的理解。对于...
Java反序列化是将已序列化的字节流恢复为原始Java对象的过程。这一过程涉及到`java.io.ObjectInputStream`类的`readObject()`方法,该方法能够从输入流中读取字节序列并将其转化为对象。为了实现反序列化,Java对象...
除了序列化,`json-lib`还支持反序列化,即将JSON字符串转换回Java对象: ```java Person deserializedPerson = (Person) JSONSerializer.toJava(jsonString); ``` 6. JSONPath和JSONSchema: 在实际应用中,...