Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > Java > EJB(Enterprise JavaBeans)入门(8)
【标  题】:EJB(Enterprise JavaBeans)入门(8)
【关键字】:Java,is,EJB,Bean,Enterprise,JavaBean,Beans,Be,EJB,Enterprise,JavaBeans
【来  源】:网络

EJB(Enterprise JavaBeans)入门(8)

Your Ad Here EJB(Enterprise JavaBeans)入门(8)

本章主要讲述序列化 的相关知识

本章讲述内容

  • 序列化并不是完全自动的
  • 序列化必需要定制

Bean 的引用不会序列化
自己试一下

Seems to work...
BankAccount account = getBankAccountHome().findById(42);
ObjectOutputStream out = new ObjectOutputStream(...);
out.writeObject(account);
out.close();
You should get an exception when you attempt to send a message
ObjectInputStream in = new ObjectInputStream(...);
BankAccount account = (BankAccount)in.readObject();
in.close();
account.getBalance();

· 解决方案: 使用 Handle
BankAccount account = getBankAccountHome().findById(42);
ObjectOutputStream out = new ObjectOutputStream(...);
out.writeObject(account.getHandle());
out.close();
ObjectInputStream in = new ObjectInputStream(...);
Handle handle = (Handle)in.readObject();
BankAccount account = (BankAccount)handle.getEJBObject();
in.close();
account.getBalance();

· 问题: Bean 引用 Bean
不是一个真正的问题
服务器自动地处理对其它 Bean 的直接引用

public class BankAccountBean implements EntityBean {
public int id;
public double balance;
public Customer owner;
...
}

· 问题: Bean 引用一组 Bean

对 Bean 的间接的引用 (通过一个 Collection) 不是能够由服务器来处理的
我们必需提供定制的序列化

public class CustomerBean implements EntityBean {
public int id;
public Vector accounts;
...
}

定制序列化

  • 可序列化对象可以调整它序列化的方式
  • 域可以被标记为 " transient "
    • " transient " 意味着 "不要序列化"
    • 这些域在序列化时被忽略,在反序列化时为空
  • 特殊的方法:
    • writeObject() - 为实例提供定制的序列化
    • readObject() - 为实例提供定制的反序列化

一个示例

  • 序列化未编码的口令是潜在的安全问题
  • 考虑 User
    • 可序列化
    • " password " 域被标记为 " transient "
import java.io.*;

public class User implements Serializable {
private String name;
private transient String password;
...
}

一个示例: writeObject()

  • 调用 defaultWriteObject() 来自动地序列化所有的 non-transient 域
  • 自己处理特殊的域
private void writeObject(ObjectOutputStream out)
throws IOException {
out.defaultWriteObject();
out.writeObject(encode(getPassword()));
}

一个示例: readObject()

  • 调用 defaultReadObject() 来自动地反序列化所有的 non-transient 域
  • 自己处理特殊的域
private void readObject(ObjectInputStream in)
throws ClassNotFoundException, IOException {
in.defaultReadObject();
setPassword(decode((String)in.readObject()));
}

序列化 Bean 引用

  • Handle 可以作为 Bean 引用序列化的替代
  • 但是... 哪个类应该来实现定制的序列化呢?
    • Bean 类本身不序列化
    • 我们也不能扩展 Vector 类

    引入一个中间对象 Object

    • 通常总是需要的
    • 中间对象可以提供定制的序列化

    private void writeObject(ObjectOutputStream out)
    throws IOException {
    out.defaultWriteObject();
    out.writeObject(getBean().getHandle());
    }

    但是稍等一下... 还有更多的问题

    • serialVersionUID 域是不同版本间兼容的标记
    • 例如:
      • 创建一个类的实例
      • 序列化它
      • 修改此类 (添加/删除 non-static 域)
      • 反序列化
    • 发生了什么?
      不兼容版本的异常被抛出

    版本兼容性

    • 同一个类的不兼容版本有不同的 serialVersionUID
      • 如果您不提供一个值,将回自动产生一个
      • 生成的值是基于类的"形状"
    • 如果值匹配,反序列化过程将为存在的域尽量提供值
    • 只有同时存在于两个版本的域才会被恢复
      • 当前版本所没有的域被忽略
      • 当前版本新出现的域被置空

    您应该如何设定此值?

    • SerialVer 工具可以用来生成一个 id
      • id 存放在 static final 的域中

      public class BankAccount implements Serializable {
      static final long serialVersionUID = 3206093459760846163L;
      ...
      }

      本章讲述内容

      • readObject() 和 writeObject() 可以用来提供定制的序列化功能
      • That references between beans are possible--But that they must be managed
      • serialVersionUID 被用来表明类的不同版本间的兼容性
      (未完待续)
EJB(Enterprise JavaBeans)入门(9):【上一篇】
控制bean定制器的技巧(3):【下一篇】
【相关文章】
  • EJB(Enterprise JavaBeans)入门(9)
  • EJB(Enterprise JavaBeans)入门(10)
  • 全面研读EJB 2.0(1)
  • 全面研读EJB 2.0(2)
  • 全面研读EJB 2.0(3)
  • javabean与ejb的区别
  • J2EE 组件开发:会话EJB
  • EJB 异常处理的最佳做法(1)
  • EJB 异常处理的最佳做法(2)
  • 用JavaBean实现文件上载(1)
  • 【随机文章】
  • 点击删除链接后弹出一个对话框提示确认删除的代码
  • 然后用手擦了擦额头的汗水,坦然地在她们诧异的目光笼罩下说:“我是公司派来促销员。这货是公司发过来的
  • NGN 集成开发环境 开发历程 第一部分放出——未完待续
  • OGRE分析之文件系统 (1)
  • 数据访问的基本类
  • 同学要的一个东西
  • 快速浏览脱机网页
  • Windows 2000 更改CD曲目
  • ABAP数据库操作系列(4)
  • Windows XP的八大安全策略逐个细解
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 bbb软讯网络 All Rigths Reserved.