java的序列化机制原理分析(二)

2014-11-24 08:12:20 · 作者: · 浏览: 1
return;
} else if (obj instanceof ObjectStreamClass) {
writeClassDesc((ObjectStreamClass) obj, unshared);
return;
}
}

// remaining cases
//写入类实例对象的数据,第一次总是在此执行
if (obj instanceof String) {
writeString((String) obj, unshared);
} else if (cl.isArray()) {
writeArray(obj, desc, unshared);
} else if (obj instanceof Enum) {
writeEnum((Enum) obj, desc, unshared);
} else if (obj instanceof Serializable) { //我们的bean需要实现Serializable接口,才能进行序列化
writeOrdinaryObject(obj, desc, unshared);
} else {
if (extendedDebugInfo) {
throw new NotSerializableException(
cl.getName() + "\n" + debugInfoStack.toString());
} else {
throw new NotSerializableException(cl.getName());
}
}
} finally {
depth--;
bout.setBlockDataMode(oldMode);
}
}

我们先简单的看下如果是一个String,如何做这个序列化的过程:
[java]
private void writeString(String str, boolean unshared) throws IOException {
handles.assign(unshared null : str);
long utflen = bout.getUTFLength(str);
if (utflen <= 0xFFFF) {
bout.writeByte(TC_STRING);
bout.writeUTF(str, utflen);
} else {
bout.writeByte(TC_LONGSTRING);
bout.writeLongUTF(str, utflen);
}
}

bout的writeUTF方法:
[java]
void writeUTF(String s, long utflen) throws IOException {
if (utflen > 0xFFFFL) {
throw new UTFDataFormatException();
}
writeShort((int) utflen); //先写入长度,
if (utflen == (long) s.length()) {
writeBytes(s); //然后写入字节流
} else {
writeUTFBody(s);
}
}

很简单,就是写入一个字符串的一个字节的标示符,然后写入字符串的字节流。

那么再看看writeOrdinaryObject(obj, desc, unshared);如何对一个bean进行序列化

[java]
private void writeOrdinaryObject(Object obj,
ObjectStreamClass desc,
boolean unshared)
throws IOException
{
if (extendedDebugInfo) {
debugInfoStack.push(
(depth == 1 "root " : "") + "object (class \"" +
obj.getClass().getName() + "\", " + obj.toString() + ")");
}
try {
desc.checkSerialize(); //检查下是否可以进行序列化,比如socket对象之类的,如果对象无法进行序列化,则抛出异常。

bout.writeByte(TC_OBJECT); //先写入一个字节的类对象的标示符
writeClassDesc(desc, false); //序列化对象的class类信息 www.2cto.com
handles.assign(unshared null : obj); //保存类的seariableID跟对象的映射关系
if (desc.isExternalizable() && !desc.isProxy()) { //如果我们自定义了对象的序列化过程,则调用对象的writeExternalData方法。如果实现Externalizable
// /** true if represented class implements Externalizable */
// private boolean externalizable;
writeExternalData((Externalizable) obj);
} else {
writeSe