import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.HashMap;
import java.util.Map;
import net.blogjava.frankiegao123.util.ByteUtil;
public class HelloWorld {
public static void main(String[] args) throws IOException {
Map<String, String> map = new HashMap<String, String>();
map.put("123", "abc");
map.put("456", "def");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream ooo = new ObjectOutputStream(baos);
ooo.writeObject(map);
byte[] bys = baos.toByteArray();
// 长度需要减去 4 个字节:AC ED 00 05
// AC ED -- 魔法数字
// 00 05 -- 版本号
System.out.println(bys.length - 4);
}
}
或许不应该叫“魔法数字”,魔法数字是《重构》一书中的概念,与这里的不关,呵呵。
这里应该称为“魔数(magic number)”,魔数一般用于减少读取到垃圾数据的几率。像 Java 的 class 文件也有魔数,即 CA FE BA BE,类加载器加载字节码时,会先验证这 4 个字节,如果头 4 个字节不是这 4 个,那么下面也别做了,肯定不是个类文件,这样做的目的是可以加速错误的产生,不需要浪费无用功。
像很多网络传输协议中也带有魔数,比如规定报文中使用 A0 A0 A0 A0 作为魔数,当收到消息时先判断魔数是否正确,如果不正确,可以认为这是一段垃圾数据,不需要处理。