Java 序列化任何对象
我试着这样做:Java 序列化任何对象,java,Java,我试着这样做: ByteArrayOutputStream b = new ByteArrayOutputStream(); ObjectOutputStream o = new ObjectOutputStream(b); o.writeObject(obj); 其中obj是一个简单的I类: class Car { int id; String color; //... } 但是我得到了java.io.NotSerializableException 是否可以将任何类型的j
ByteArrayOutputStream b = new ByteArrayOutputStream();
ObjectOutputStream o = new ObjectOutputStream(b);
o.writeObject(obj);
其中obj是一个简单的I类:
class Car {
int id;
String color;
//...
}
但是我得到了java.io.NotSerializableException
是否可以将任何类型的java.lang.Object
序列化为字节数组
?是吗,怎么了
更新:
将被“序列化”的类未实现可序列化的接口;我试图做的这件事背后的想法是,我正在尝试建立一个支持java.util.Map
的数据库,其中映射中的对象put
直接存储在数据库中,因此任何类型的Object
我还看到了一些序列化框架,为了绕过序列化任意对象的“限制”,有一个类注册,如:
kryo.register(SomeClass.class, 0);
我不确定
但我非常确定的是,我需要做:
Kryo kryo = new Kryo();
// ...
Output output = new Output(new FileOutputStream("file.bin"));
SomeClass someObject = ...
kryo.writeObject(output, someObject);
output.close();
- 读取对象的字段和方法的反射
您的Car
类需要实现Serializable
接口,以便您能够序列化对象
class Car implements Serializable {
下面是用于序列化/反序列化的通用ObjectSerializer(改编自Apache libs):
公共类对象序列化程序{
私有静态最终字符串标记=“ObjectSerializer”;
公共静态字符串序列化(可序列化obj){//IOException{
如果(obj==null)返回“”;
试一试{
ByteArrayOutputStream serialObj=新建ByteArrayOutputStream();
ObjectOutputStream objStream=新的ObjectOutputStream(serialObj);
objStream.writeObject(obj);
objStream.close();
返回encodeBytes(serialObj.toByteArray());
}捕获(例外e){
//抛出WrappedIOException.wrap(“序列化错误:+e.getMessage(),e);
Log.e(标记,“序列化错误:+e.getMessage());
返回null;
}
}
公共静态对象反序列化(字符串str){//IOException{
if(str==null | | str.length()==0)返回null;
试一试{
ByteArrayInputStream serialObj=新的ByteArrayInputStream(decodeBytes(str));
ObjectInputStream objStream=新的ObjectInputStream(serialObj);
返回objStream.readObject();
}捕获(例外e){
//抛出WrappedIOException.wrap(“反序列化错误:+e.getMessage(),e);
Log.e(标记,“反序列化错误:+e.getMessage());
返回null;
}
}
公共静态字符串编码字节(字节[]字节){
StringBuffer strBuf=新的StringBuffer();
for(int i=0;i>4)和0xF)+((int)'a');
追加((char)((字节[i])&0xF)+((int'a'));
}
返回strBuf.toString();
}
公共静态字节[]解码字节(字符串str){
byte[]bytes=新字节[str.length()/2];
对于(int i=0;i 字节[i/2]=(字节)((c-‘a’)不可能使用java.io.ObjectOutputStream来序列化每个对象
来自
只能选择支持java.io.Serializable接口的对象
写在溪流中
如果您绝对需要java对象序列化,那么值得一试。默认情况下,您只需执行以下操作:
Kryo kryo = new Kryo();
// ...
Output output = new Output(new FileOutputStream("file.bin"));
SomeClass someObject = ...
kryo.writeObject(output, someObject);
output.close();
Kryo不要求您的类实现Serializable
,您可以为您的类提供单独的接口来控制序列化形式。但这是可选的
代码kryo.register(SomeClass.class,0)
也是可选的,它优化了序列化过程。查看google GSON-它可能有用吗?只需将可序列化的实现添加到您的汽车对象序列化规范中即可。无法做到这一点,我的应用程序需要处理任何类型的对象整洁的代码,但是,它仅限于可序列化的对象,我需要一个可以rialize java.lang.Object(不是真正的可序列化类型)也许我错了,但实际上对象必须是可序列化的才能用于此目的