最近在序列化某JAVA类时,碰到怪事,原来是sql 连接字符串与数据库的character set不同,字符被转义所致。
环境:Mysql 5.0.51a-community-nt Java 1.6.0_20-b02
解决办法是先测试数据库与mysql的字符集,然后使connection string与其一致。
show create table t1;
show variables like ‘char%’;
序列化的本意是将该类的实例保存到数据库,然后再读出来,结果读出的比写入时多一个byte,导致读取时出现
StreamCurruptedException: 30。
如果对类做随机修改,则没有问题。
代码如下,其中gameTable即为要写入的对象实例:
写入:
1 | pstmt = this.conn.prepareStatement(sql); |
读出:
1 | ObjectInputStream ois = new ObjectInputStream(rs.getBinaryStream(1)); |
经过对数据库信息的逐字节比较(过程枯燥且痛苦),发现由于自动生成的serialVersionUID 如果包含0x0 (‘/0’),则在调用setBinaryStream时被翻译成 0x5C 0x30 (‘/‘ ‘0’),tricky!如果serialVersionUID 不含0x0则不会有任何问题,现在还不知是哪里做了这个翻译。