`
yourenyouyu2008
  • 浏览: 287696 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

序列化总结

阅读更多

代码示例

序列化ObjectOutputStream

java.io.ByteArrayOutputStream baos = new ByteArrayOutputStream();

java.io.ObjectOutputStream oos;

    try {

       oos = new ObjectOutputStream(baos);

       oos.writeObject(object);// object:要序列化的对象

} catch (IOException e) {}

将对象序列化到输出流里(可以是文件流、字节流等等)

反序列化ObjectInputStream

从输入流中反序列化对象

java.io.ByteArrayInputStream bais =。。。;

java.io.ObjectInputStream ais;

try {

     ais = new ObjectInputStream(bais);

     Object bo = ais.readObject();

     bs.setBo(bo);

}

ClassLoader相关

序列化最重要的是反序列化时如何找到相关的class,这就涉及到反序列化的classloader机制。

ObjectInputStream通过resolveClass(ObjectStreamClass desc)方法去加载class,可以通过子类重写该方法加载classJsf中的反序列化重写了改方法,从当前线程加载。

ObjectInputStream

protected Class<?> resolveClass(ObjectStreamClass desc)

    throws IOException, ClassNotFoundException

    {

    String name = desc.getName();

    try {

//不是通过当前线程来加载类的,指定了classloader

        return Class.forName(name, false, latestUserDefinedLoader());

    } catch (ClassNotFoundException ex) {

        Class cl = (Class) primClasses.get(name);

        if (cl != null) {

       return cl;

        } else {

       throw ex;

        }

    }

}

Jsf

public class ApplicationObjectInputStream extends ObjectInputStream {

    public ApplicationObjectInputStream(){

        super();

    }

    public ApplicationObjectInputStream(InputStream in) {

        super(in);

    }

    protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException {

        return Class.forName(desc.getName(),true,

                Thread.currentThread().getContextClassLoader());

    }

}

使用子类反序列化

 ais = new ApplicationObjectInputStream(bais);

Object bo = ais.readObject();

对象自己管理序列化

参见Externalizable介绍

http://www.360doc.com/content/10/0729/19/495229_42337853.shtml

http://wxg6203.iteye.com/blog/642598

当类反序列化他的属性时报ClassNotFoundException 可以通过readExternal方法来为他的属性类指定classloader。

java.lang.InstantiationException

当序列化类的某些方法中使用了直接new abstract  class,会导致对象反序列化时报

java.lang.InstantiationException异常。原因未知。

 

如下代码导致MyClass不能被反序列化

MyClass implements Serializable {

Public void test(){

Hidden  hidden=new Hidden() {
     
public Map nameValue() {
   
Map<String, String> deployMap = new HashMap<String, String>();
   
deployMap.put("name", ProcessForm.BO_DEPLOYMENT_ID);
   
deployMap.put("value", bussinessObjectContex
    
.getDeployment().getId());
   
return deployMap;
     
}
  };

Hidden.xxxxx;
}

 

public abstract class Hidden{

分享到:
评论
2 楼 yourenyouyu2008 2010-06-14  
效率这个没有在意,这是jsf本身的实现方式,我们只在反序列化出差后才去关注这个问题的。介绍下你们高效的方式吧。
1 楼 xzh_endless 2010-06-13  
你这个实现方式根本没效率 基本上就是个玩具。

相关推荐

    JSon发序列化总结

    ### JSON序列化与反序列化的C#实现 #### 概述 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它易于人阅读和编写,同时也易于机器解析和生成。JSON是基于纯文本的格式,并且是完全独立于语言的。...

    C#编程总结(一)序列化总结

    在C#中,序列化主要分为三种类型:二进制序列化、XML序列化和数据契约序列化。 1. **二进制序列化**: 二进制序列化是将对象的完整状态,包括私有字段和类型信息,转换为字节流,适合在应用程序的不同调用之间保留...

    C++ JSON 序列化与反序列化

    本篇文章将深入探讨C++中JSON的序列化与反序列化。 **一、JSON序列化** 序列化是指将C++的对象转换为JSON字符串的过程,以便在网络上传输或保存到文件中。常见的C++ JSON序列化库有RapidJSON、nlohmann/json、...

    net Json 序列化和反序列化

    只要对json和序列化和反序列化总结,以及代码的案例:我们很多时候会涉及到几个序列化对象的使用:DataContractJsonSerializer,JavaScriptSerializer 和 Json.NET。

    java 对象的序列化与反序列化

    Java对象的序列化和反序列化是Java编程中一项...总结,Java对象的序列化和反序列化是Java编程中的基础概念,它涉及到数据持久化、网络通信等多个方面。理解并熟练运用这一技术,能够帮助开发者更有效地管理和传递数据。

    C#和Java的序列化反序列化

    总结来说,C#和Java的序列化和反序列化机制都是各自语言中不可或缺的一部分,它们使得数据能够在不同环境之间自由流动。理解和掌握这些技术对于任何软件开发者来说都是非常重要的,特别是涉及到数据持久化、网络通信...

    基于boost的序列化与反序列化

    总结来说,Boost.Serialization是C++开发中一个强大且灵活的工具,它简化了对象的序列化和反序列化过程,支持多种序列化格式和流类型,使得数据的持久化和跨进程传输变得简单易行。通过熟练掌握Boost.Serialization...

    序列化和反序列化的封装类

    总结来说,序列化和反序列化是将对象转换为可存储或传输的格式的过程,而封装类的使用则可以简化这些操作,使得开发者可以更加专注于业务逻辑而不是底层的序列化细节。在C#中,我们可以利用.NET框架提供的工具来实现...

    hessian学习基础篇——序列化和反序列化

    总结起来,Hessian是一种高效、轻量级的二进制序列化协议,特别适合于跨语言的网络通信。理解并掌握Hessian的基本概念和使用方法,能够提升我们的开发效率,优化应用程序的性能。在实际项目中,结合标签中的“源码”...

    java序列化(Serializable)的作用和反序列化.doc

    ### Java序列化(Serializable)的作用与反序列化详解 #### 一、序列化的概念 序列化是指将程序中的对象转换为一系列字节流的过程,主要用于保存对象的状态或在网络之间传输对象。序列化的主要目的是为了能够持久化...

    hashtable序列化与反序列化

    总结一下,`HashTable`的序列化和反序列化是通过实现`Serializable`接口并利用`ObjectOutputStream`和`ObjectInputStream`来完成的。在实际应用中,这有助于数据的持久化存储和跨进程通信。然而,进行序列化操作时,...

    delphi序列化与反序列化

    总结,Delphi中的序列化与反序列化是实现对象持久化和跨平台数据交换的关键技术。组件序列化主要依赖`WriteComponent`和`ReadComponent`,而结构体序列化则需要自定义的序列化代码。开发者应选择合适的序列化库,...

    java反序列化工具

    Java反序列化是一种将已序列化的对象状态转换回对象的过程,它是Java平台中持久化数据的一种常见方式。在Java应用程序中,序列化用于保存对象的状态以便稍后恢复,或者在网络间传输对象。然而,这个过程也可能引入...

    C#序列化与反序列化(包括复杂xml对象)

    总结,C#的XML序列化和反序列化是处理XML数据的强大工具。无论是简单的键值对还是复杂的对象结构,都可以通过适当的注解和`XmlSerializer`类轻松实现。在实际开发中,掌握这些技巧将有助于提高代码的可读性和可维护...

    Jedis序列化和反序列化使用jar

    总结来说,使用Jedis操作Redis时,正确处理对象的序列化和反序列化是关键。结合Apache Commons库,我们可以方便地实现这一过程,并充分利用Redis的高性能存储特性。在开发过程中,要根据具体需求选择合适的序列化...

    Qt 序列化函数和反序列化函数

    总结一下,Qt的序列化和反序列化主要依赖于QDataStream,它提供了便捷的方法来处理不同类型的数据。通过重载操作符,我们可以使自定义的类也能参与序列化和反序列化过程。同时,Qt的其他类如QFile、QSerialPort等也...

    C#对象序列化与反序列化

    - **反序列化的使用总结**:反序列化时需要注意类型兼容性和安全性问题。 #### 6. 自定义序列化(仅适用于二进制与SOAP) ##### (1) 自定义序列化的实现方式 - 实现`ISerializable`接口:允许开发者控制序列化过程...

    C#对象三种形式的序列化和反序列化

    总结,C#提供了多种序列化技术,每种都有其特定的使用场景和优势。在实际开发中,开发者需要根据需求选择合适的方法,并理解如何处理不同类型的数据,如图片,以确保数据完整性和传输效率。在给定的示例中,`...

    C# 各种序列化和反序列化

    总结来说,C#提供了多种序列化技术,每种都有其特定的适用场景。XML序列化适合需要清晰、结构化和可读性高的数据;SOAP序列化在早期Web服务中广泛使用,但现在已被更简洁的RESTful API取代;JSON序列化在Web开发中...

    Json反序列化

    总结,JSON反序列化是Web开发中的重要环节,它使得我们能够方便地处理由JSON格式传递的数据。了解和掌握JSON反序列化的原理、常见库以及注意事项,对于提升开发效率和保证代码质量具有积极意义。在实际工作中,应...

Global site tag (gtag.js) - Google Analytics