`

序列化初探

阅读更多
序列化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,可以通过子类重写该方法加载class。Jsf中的反序列化重写了改方法,从当前线程加载。
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();

对象自己管理序列化package java.io;

public class ObjectStreamClass implements Serializable {



由对象控制自己属性(属性的属性的属性…)的序列化和反序列化。
Class MyObject{

Private ClassXX aa;

000000

Private ClassYY bb;



private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {

        ois.defaultReadObject();//对aa、bb等属性进行反序列化
        …
    }

    private void writeObject(ObjectOutputStream oos) throws IOException {

        oos.defaultWriteObject();//对aa、bb等属性进行序列化
        oos.writeObject(getTransactionManager());

        oos.writeObject(getTransactionAttributeSource());

    }

java.lang.InstantiationException
当序列化类的某些方法中使用了直接new的 abstract  class,会导致对象反序列化时报
java.lang.InstantiationException异常。原因未知。


如下代码导致MyClass不能被反序列化
public class 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.haha;
}



public abstract class Hidden{
   public abstract void haha(){}
}
分享到:
评论

相关推荐

    CVE-2020-2555——Coherence反序列化初探 .pdf

    CVE-2020-2555——Coherence反序列化初探 安全防御 企业安全 安全架构信息安全 安全防御

    《基于GDI-》2D图形软件开发方法初探-2D几何画板.doc

    * 图形序列化:实现图形的序列化,以便重复操作图元。 二、GDI+技术 * GDI+简介:GDI+是一种基于Windows的图形设备接口,提供了图形绘制、图形测量等功能。 * GDI+在二维图形软件中的应用:包括基本图形的绘制、...

    GWT通信机制初探

    在GWT中,数据对象需要实现Serializable接口,以便进行序列化和反序列化。GWT提供了标准的序列化策略,但也可以自定义实现,以处理更复杂的数据类型或优化性能。 标签中的“源码”意味着文章可能深入到GWT的内部...

    R时间序列初探_r_时间序列_timeseries_时间序列分析_

    总结,R语言为时间序列分析提供了丰富的功能和便捷的接口,无论是简单的数据可视化,还是复杂的模型构建和预测,都能轻松应对。通过深入学习和实践,我们可以利用R有效地挖掘时间序列数据中的隐藏模式和趋势,为决策...

    快速自动化常温批量测定乙丙橡胶序列分布方法初探.pdf

    本文探讨了一种快速自动化常温批量测定乙丙橡胶序列分布的方法,旨在提高分析效率和准确性,简化操作流程。乙丙橡胶的序列分布是其微观结构的重要参数,影响产品的性能和应用,传统方法可能存在效率低、成本高或操作...

    《基于GDI》2D图形软件开发方法初探-2D几何画板毕业论文.doc

    5. 序列化:本论文实现了图形绘制结果的序列化,实现了重复操作图元的功能。 6. 共点运动:本论文实现了共点运动功能,可以动态观察二维空间中关联对象的共点运动,当某个对象的相关属性改变时,对其他关联对象的...

    《基于gdi》2d图形软件开发方法初探-2d几何画板毕业论文设计.doc

    为了增强用户体验,系统还实现了图形元素的序列化,允许用户保存和重复操作图元,同时支持图元的选择、存储和修改,如拖动、改变大小等动态操作。 2D几何画板不仅限于静态图形的绘制,它还引入了共点运动的概念,...

    ASP.NET ViewState 初探

    ViewState的工作原理相当简单:在服务器端,当ASP.NET页面执行时,页面上所有控件的状态(比如Label控件的文本)会被序列化成一个加密的字符串,然后放入一个隐藏的HTML表单字段中。这个隐藏字段随着页面一起发送到...

    初探类图.ppt初探类图.ppt初探类图.ppt

    《初探类图》 统一建模语言(UML,Unified Modeling Language)是一种标准化的建模工具,专门用于软件开发中的需求分析、设计和可视化。它以图形化的方式描绘出系统的结构和行为,使得复杂的软件工程变得更加易于...

    《基于gdi》2d图形软件开发方法初探-2d几何画板.doc

    该系统的核心特性之一是序列化,它可以保存和恢复绘制的图形状态,使得用户可以进行多次编辑和操作。同时,画板中的图元具有选择和修改的灵活性,比如选定图形后可进行拖动和大小调整,增强了交互性和动态性。 2D...

    初探WSDL2JAVA工具的使用

    3. **实现消息映射**:每个操作对应的消息会被映射到Java方法上,通常每个数据成员都会生成相应的get和set方法,以支持数据的序列化和反序列化。 4. **配置通信细节**:工具还会生成用于配置通信细节的代码,如地址...

    数据挖掘技术应用于档案管理研究初探.pdf

    档案管理中应用的数据挖掘技术包括多种算法,如决策树、聚类分析、关联规则挖掘、文本挖掘、时间序列分析等。这些算法能够帮助从不同维度解读档案数据,发掘其中的模式和关联,从而提高档案资源的利用效率和管理效能...

    基于LSTM深度神经网络的精细化气温预报初探.pdf

    【基于LSTM深度神经网络的精细化气温预报初探】这篇研究主要探讨了如何利用Long Short-Term Memory(LSTM)深度神经网络进行精细化气温预测。LSTM是一种特殊类型的循环神经网络(RNN),特别适合处理时间序列数据,...

    基于GDI2D图形软件开发方法初探-2D几何画板毕业论文.doc

    这些关键词突出了论文的核心技术和概念,其中面向对象编程是软件设计的基础,命名空间用于组织代码,序列化确保数据的持久性,而GDI+则是实现2D图形绘制的关键技术,图元则指代图形的基本构造单元。 这篇毕业论文...

    大数据背景下医院档案管理信息化建设初探.zip

    2. 数据类型多样化:除了文字记录,还包括图像、视频、基因序列等非结构化数据,需要更高级别的管理技术。 3. 数据价值挖掘:大数据技术可以揭示隐藏的医疗模式和趋势,为疾病预防、诊断和治疗提供支持。 二、医院...

Global site tag (gtag.js) - Google Analytics