`

序列化初探

阅读更多
序列化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反序列化初探 安全防御 企业安全 安全架构信息安全 安全防御

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

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

    模型解释初探

    模型解释初探,采取局部逼近的方式对各种难以解释的非线性模型进行解释。包括对文本、图片、结构化数据、序列型数据的支持。

    Dubbo框架初探

    远程通讯:提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。2.集群容错:提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失

    简单的分布式RPC框架blackRpc

    序列化方式支持:fastjson,msgpack,protostuff 集群负载均衡策略:轮训,加权轮训,随机,加权随机,一致性哈希 ③ 支持spring多种作用域 ④ 该框架比较适合初探分布式RPC原理的读者。 笔者邮箱地址:2362910894@qq...

    javaeye热点阅读

    1.3 Java、PHPRPC、Hessian、Burlap、AMF3、XML 序列化的效率对比1.4 Effective Java Second Edition中文版已出版1.5 国内开源工作流 Fire Workflow 出炉了 1.6 Word/Excel/PDF文件转换成HTML整理 1.7 Java5 ...

    生态足迹研究现状及基于净初级生产力的计算方法初探* (2008年)

    在对国际组织发布的生态足迹报告以及生态足迹文献发表情况进行统计的基础上,回顾了国内外的生态足迹理论以及应用在空间尺度、时间序列、消费分类、产量因子及方法标准化等方面的最新进展;详细介绍了一种较新的生态...

    学习OPENCV(中文版)

    第3章 初探OpenCV OpenCV的基本数据类型 CvMat矩阵结构 IplImage数据结构 矩阵和图像操作 绘图 数据存储 集成性能基元 小结 练习 第4章 细说HighGUI 一个可移植的图形工具包 创建窗口 载入图像 显示图像 视频的处理 ...

    学习opencv中文版

    积分图像 距离变换 直方图均衡化 练习 第7章 直方图与匹配 直方图的基本数据结构 访问直方图 直方图的基本操作 一些更复杂的策略 练习 第8章 轮廓 内存 序列 查找轮廓 Freeman链码 轮廓例子 另一个轮廓例子 深入分析...

    举例讲解Python中的迭代器、生成器与列表解析用法

    “可迭代对象”的概念在Python中是相当新颖的,基本这就是序列观念的通用化:如果对象时实际保存的序列,或者可以再迭代工具环境中一次产生一个结果的对象,那就看做是可迭代的。 &gt;&gt;文件迭代器 作为内置数据类型的文件...

    R语言资料大全 of 数据分析玩家

    2012/07/18 12:02 6,013,712 时间序列的R实现.pdf 2012/07/17 18:45 17,568,422 机器学习的R实现.pdf 2012/07/18 11:56 4,157,109 计量经济学的R实现.pdf 22 个文件 95,460,208 字节 2012/07/18 22:05 &lt;DIR&gt; R案例...

    asp.net知识库

    泛型的序列化问题 .NET 2.0 泛型在实际开发中的一次小应用 C#2.0 Singleton 的实现 .Net Framwork 强类型设计实践 通过反射调用類的方法,屬性,字段,索引器(2種方法) ASP.NET: State Server Gems 完整的动态加载/卸载...

    《新媒体数据挖掘——基于R语言》课件

    7 1.3 R在计算传播学中的典型应用 9 1.3.1 用R进行文本分析初探 9 1.3.2 互联网在线数据收集 10 1.3.3 社会网络分析 12 1.4 总结与提高 13 1.5 习题 14 第2章 R语言开发环境 15 2.1 R的获取、安装和基本使用 16 ...

    C语言入门经典(第4版)--源代码及课后练习答案

    10.4.2 转义序列 391 10.4.3 整数输出 392 10.4.4 输出浮点数 394 10.4.5 字符输出 395 10.5 其他输出函数 398 10.5.1 屏幕的非格式化输出 398 10.5.2 数组的格式化输出 399 10.5.3 数组的格式化输入 400 ...

    数据挖掘在各行业的应用论文

    面向数据挖掘的时间序列符号化方法研究.kdh Internet数据挖掘原理及实现.caj 预测性模型中的一种数据挖掘算法.kdh 数据挖掘技术及其在电力系统中的应用1.caj Web上的数据挖掘技术和工具设计.kdh Web数据挖掘技术探讨...

    数据挖掘论文合集-242篇(part1)

    EIS 环境下的数据挖掘技术的研究.caj FCC油品质量指标智能监测系统的数据挖掘与修正技术...面向数据挖掘的时间序列符号化方法研究.kdh 面向集成竞争情报系统的数据挖掘应用研究.caj 预测性模型中的一种数据挖掘算法.kdh

    数据挖掘论文合集-242篇(part2)

    EIS 环境下的数据挖掘技术的研究.caj FCC油品质量指标智能监测系统的数据挖掘与修正技术...面向数据挖掘的时间序列符号化方法研究.kdh 面向集成竞争情报系统的数据挖掘应用研究.caj 预测性模型中的一种数据挖掘算法.kdh

    数据挖掘论文合集-242篇(part3)

    EIS 环境下的数据挖掘技术的研究.caj FCC油品质量指标智能监测系统的数据挖掘与修正技术...面向数据挖掘的时间序列符号化方法研究.kdh 面向集成竞争情报系统的数据挖掘应用研究.caj 预测性模型中的一种数据挖掘算法.kdh

Global site tag (gtag.js) - Google Analytics