`
sw1982
  • 浏览: 511455 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Java中对象集合的序列化

阅读更多

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();
        }
    }



}


 
分享到:
评论
1 楼 刘彦明 2013-04-20  
这样真的可行吗?你是没有关闭流才能这样做吧?如果关闭后再打开好像不能存集合

相关推荐

    JAVA对象序列化保存为XML文件的工具类

    以下是一个简单的示例,展示了如何使用`ObjectToXMLUtil`工具类将Java对象序列化到XML文件以及从XML文件中反序列化: ```java public class Test { public static void main(String[] args) { // 创建一个示例...

    java不同对象及集合的多次复制

    - **序列化与反序列化**:将对象序列化为字节数组,然后再反序列化为新的对象,实现深拷贝。 3. **注解实现对象复制** - **Apache Commons BeanUtils库**:提供了`BeanUtils.copyProperties()`方法,可以快速实现...

    使用XStream序列化/反序列化对象

    XStream是一个强大的库,它允许开发者以XML格式进行序列化和反序列化Java对象。在这个场景中,我们将深入探讨如何使用XStream处理对象的序列化和反序列化。 首先,让我们了解什么是XStream。XStream是由Joe Walnes...

    json序列化与反序列化处理代码(java版本)

    极好的序列化与发序列化代码。可以处理array集合,数组或者单个对象等的序列化与反序列化。

    Java Json序列化与反序列化

    JSON是一种轻量级的数据交换格式,它允许我们将Java对象转换为JSON字符串,反之亦然,方便在网络间传输或者保存在文件系统中。本篇文章将深入探讨Java中JSON的序列化与反序列化,以及相关的工具库。 一、JSON概述 ...

    java对象集合转json格式

    总的来说,Java对象集合转JSON格式是通过JSON库实现的,而Jackson是其中最常用的一个。理解这一过程有助于提升你在处理数据转换时的效率和灵活性。通过深入学习和实践,你还可以掌握更多高级特性,如类型绑定、注解...

    用于生成利用不安全Java对象反序列化的有效负载的概念验证工具.zip

    例如,它可能会利用` CommonsCollections`框架的一个已知漏洞,该漏洞允许攻击者通过构造特殊的集合序列化对象来执行命令。 要使用ysoserial,首先需要解压ysoserial_master.zip,然后通过Java编译和运行其源码。它...

    hashtable序列化与反序列化

    `HashTable`,作为Java中的一个内置集合类,也可以被序列化。`HashTable`继承自`Dictionary`类,并实现了`Serializable`接口,因此它支持序列化操作。 要序列化一个`HashTable`对象,我们需要执行以下步骤: 1. ...

    Java SE编程入门教程 java序列化(共14页).pptx

    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库及其在Java对象与JSON格式数据之间的相互转换。 知识点一:GSON简介 GSON是由Google开发的一个用于在Java对象和JSON数据...

    java 对象与xml 相互序列化 xml4j (含源码)

    Java对象与XML之间的相互序列化是软件开发中常见的任务,特别是在数据交换、持久化或配置存储等场景。XML4J是一个用于Java对象到XML转换的工具,它提供了方便的方法将Java对象序列化为XML文档,同时也能从XML文档中...

    java 序列化和重写 hashCode 的原因

    首先,Java序列化是将一个对象转换为字节流的过程,目的是为了持久化数据或者在网络中传输对象。当一个类需要被序列化时,它需要实现`java.io.Serializable`接口。这个接口是一个标记接口,没有定义任何方法,但它的...

    java集合,多线程,序列化等基础练习源码

    Java集合、多线程以及序列化是Java编程中不可或缺的基础概念。这些技术广泛应用于各种复杂的系统设计和开发中,理解并熟练掌握它们对于提升Java程序员的技能至关重要。 首先,我们来详细探讨Java集合。Java集合框架...

    JAXB工具类 xml转为java对象 java对象转为xml

    Java Architecture for XML Binding (JAXB) 是Java平台中用于处理XML和Java对象之间转换的一个标准API。它使得在Java应用程序中使用XML数据变得更加方便,无需手动编写大量的转换代码。本教程将详细介绍JAXB如何实现...

    Java面向对象程序设计

    13. **I/O流**:Java的I/O流系统支持数据的输入和输出,包括字符流和字节流,以及过滤流、缓冲流、对象序列化等高级功能。 14. **反射**:反射机制允许程序在运行时动态获取类的信息(如类名、方法名等)并调用方法...

    json-lib 序列化和反序列化

    在`json-lib`中,序列化是指将Java对象转换成JSON字符串的过程,而反序列化则是将JSON字符串转换回Java对象。以下是对这两个过程的详细说明: 1. **序列化**: - 使用`json-lib`,你可以通过`...

    序列化,反序列化,接口

    在Java或C#等面向对象的语言中,序列化常用于将对象转换为字节流,以便存储在磁盘上或通过网络发送。序列化可以帮助我们保存应用程序的状态,使程序在下次启动时能够恢复到之前的状态。它也适用于分布式系统,如Web...

    实例解析Json反序列化之ObjectMapper(自定义实现反序列化方法)

    通过自定义反序列化方法,我们可以灵活地处理各种复杂的数据映射需求,将JSON数据准确无误地转换成Java对象,以供后端业务逻辑处理。这一过程不仅涉及到Java反射机制的运用,同时也需要对JSON格式有深入的理解。对于...

    JAVA及Jackson反序列化漏洞.docx

    Java反序列化是将已序列化的字节流恢复为原始Java对象的过程。这一过程涉及到`java.io.ObjectInputStream`类的`readObject()`方法,该方法能够从输入流中读取字节序列并将其转化为对象。为了实现反序列化,Java对象...

    java对象转换为json字符串或字符串数组

    除了序列化,`json-lib`还支持反序列化,即将JSON字符串转换回Java对象: ```java Person deserializedPerson = (Person) JSONSerializer.toJava(jsonString); ``` 6. JSONPath和JSONSchema: 在实际应用中,...

Global site tag (gtag.js) - Google Analytics