java.beans.transient_[转载]Enterprise JavaBeans 入门:序 列 化

Enterprise JavaBeans 入门

序 列 化

序列化并不是完全自动的

序列化必需要定制

05ac63f463130bd1876c1af927ae88a3.png

c6ccbc96c20bebb0d73e8e6368158ef5.png

自己试一下

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

05ac63f463130bd1876c1af927ae88a3.png

c6ccbc96c20bebb0d73e8e6368158ef5.pngBankAccount 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();

05ac63f463130bd1876c1af927ae88a3.png

c6ccbc96c20bebb0d73e8e6368158ef5.pngejb-8-1.gifpublic class BankAccountBean implements EntityBean {

public int id;

public double balance;

public Customer owner;

...

}

05ac63f463130bd1876c1af927ae88a3.png

c6ccbc96c20bebb0d73e8e6368158ef5.pngejb-8-2.gifpublic class CustomerBean implements EntityBean {

public int id;

public Vector accounts;

...

}

05ac63f463130bd1876c1af927ae88a3.png

c6ccbc96c20bebb0d73e8e6368158ef5.png可序列化对象可以调整它序列化的方式

域可以被标记为 "transient"

"transient" 意味着 "不要序列化"

这些域在序列化时被忽略,在反序列化时为空

特殊的方法:

writeObject() - 为实例提供定制的序列化

readObject() - 为实例提供定制的反序列化

05ac63f463130bd1876c1af927ae88a3.png

c6ccbc96c20bebb0d73e8e6368158ef5.png序列化未编码的口令是潜在的安全问题

考虑 User 类

可序列化

"password" 域被标记为 "transient"

import java.io.*;

public class User implements Serializable {

private String name;

private transient String password;

...

}

05ac63f463130bd1876c1af927ae88a3.png

c6ccbc96c20bebb0d73e8e6368158ef5.png调用 defaultWriteObject() 来自动地序列化所有的 non-transient

自己处理特殊的域

private void writeObject(ObjectOutputStream out)

throws IOException {

out.defaultWriteObject();

out.writeObject(encode(getPassword()));

}

05ac63f463130bd1876c1af927ae88a3.png

c6ccbc96c20bebb0d73e8e6368158ef5.png调用 defaultReadObject() 来自动地反序列化所有的 non-transient

自己处理特殊的域

private void readObject(ObjectInputStream in)

throws ClassNotFoundException, IOException {

in.defaultReadObject();

setPassword(decode((String)in.readObject()));

}

05ac63f463130bd1876c1af927ae88a3.png

c6ccbc96c20bebb0d73e8e6368158ef5.pngHandle 可以作为 Bean 引用序列化的替代

但是... 哪个类应该来实现定制的序列化呢?

Bean 类本身不序列化

我们也不能扩展 Vector 类

6d9dd1035114024c4ad10179dee8ce8f.gif

05ac63f463130bd1876c1af927ae88a3.png

c6ccbc96c20bebb0d73e8e6368158ef5.png通常总是需要的

中间对象可以提供定制的序列化

ejb-8-4.gif

private void writeObject(ObjectOutputStream out)

throws IOException {

out.defaultWriteObject();

out.writeObject(getBean().getHandle());

}

05ac63f463130bd1876c1af927ae88a3.png

c6ccbc96c20bebb0d73e8e6368158ef5.pngserialVersionUID 域是不同版本间兼容的标记

例如:

创建一个类的实例

序列化它

修改此类 (添加/删除 non-static 域)

反序列化

发生了什么?

不兼容版本的异常被抛出

05ac63f463130bd1876c1af927ae88a3.png

c6ccbc96c20bebb0d73e8e6368158ef5.png同一个类的不兼容版本有不同的 serialVersionUID

如果您不提供一个值,将回自动产生一个

生成的值是基于类的"形状"

如果值匹配,反序列化过程将为存在的域尽量提供值

只有同时存在于两个版本的域才会被恢复

当前版本所没有的域被忽略

当前版本新出现的域被置空

05ac63f463130bd1876c1af927ae88a3.png

c6ccbc96c20bebb0d73e8e6368158ef5.pngSerialVer 工具可以用来生成一个 id

id 存放在 static final 的域中

e40231199e06f4530f1189618ecc6efc.gif

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 被用来表明类的不同版本间的兼容性

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值