Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 序列化任何对象_Java - Fatal编程技术网

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(不是真正的可序列化类型)也许我错了,但实际上对象必须是可序列化的才能用于此目的