我试过这样做:
ByteArrayOutputStream b = new ByteArrayOutputStream();
ObjectOutputStream o = new ObjectOutputStream(b);
o.writeObject(obj);
obj是我做的一个简单的课程:
class Car {
int id;
String color;
//...
}
但是我得到了java.io.NotSerializableException
是否可以将java.lang.Object
中的任何byte array
序列化为Serializable
?是这样,怎么样?
更新
将被“序列化”的类不实现java.util.Map
接口;我想要做的事情背后的想法是,我正在尝试让数据库支持put
,其中地图中的对象Object
直接存储在数据库中,因此任何类型的{{ 1}}
我也看过一些序列化框架,在序列化任意对象时可以解决这个“限制”,有一个类注册如:
kryo.register(SomeClass.class, 0);
不确定这一点。
但我非常确定我需要这样做:
答案 0 :(得分:3)
您的Car
课程需要实施Serializable
界面,才能Serialize
您的对象。
class Car implements Serializable {
答案 1 :(得分:1)
不可能使用java.io.ObjectOutputStream来序列化每个Object
。
只有支持java.io.Serializable接口的对象才可以 写入溪流。
如果你绝对需要java对象序列化kryo值得一试。默认情况下,您只需要执行以下操作:
Kryo kryo = new Kryo();
// ...
Output output = new Output(new FileOutputStream("file.bin"));
SomeClass someObject = ...
kryo.writeObject(output, someObject);
output.close();
Kryo不要求您的课程实现Serializable
,您可以为您的班级提供单独的Serializer来控制序列化表单。但是可选的。
代码kryo.register(SomeClass.class, 0);
也是可选的,它优化了序列化过程。
答案 2 :(得分:0)
这里有用于序列化/反序列化的通用ObjectSerializer(改编自Apache libs):
public class ObjectSerializer {
private static final String TAG = "ObjectSerializer";
public static String serialize(Serializable obj) {// throws IOException {
if (obj == null) return "";
try {
ByteArrayOutputStream serialObj = new ByteArrayOutputStream();
ObjectOutputStream objStream = new ObjectOutputStream(serialObj);
objStream.writeObject(obj);
objStream.close();
return encodeBytes(serialObj.toByteArray());
} catch (Exception e) {
//throw WrappedIOException.wrap("Serialization error: " + e.getMessage(), e);
Log.e(TAG, "Serialization error: " + e.getMessage());
return null;
}
}
public static Object deserialize(String str) {// throws IOException {
if (str == null || str.length() == 0) return null;
try {
ByteArrayInputStream serialObj = new ByteArrayInputStream(decodeBytes(str));
ObjectInputStream objStream = new ObjectInputStream(serialObj);
return objStream.readObject();
} catch (Exception e) {
//throw WrappedIOException.wrap("Deserialization error: " + e.getMessage(), e);
Log.e(TAG, "Deserialization error: " + e.getMessage());
return null;
}
}
public static String encodeBytes(byte[] bytes) {
StringBuffer strBuf = new StringBuffer();
for (int i = 0; i < bytes.length; i++) {
strBuf.append((char) (((bytes[i] >> 4) & 0xF) + ((int) 'a')));
strBuf.append((char) (((bytes[i]) & 0xF) + ((int) 'a')));
}
return strBuf.toString();
}
public static byte[] decodeBytes(String str) {
byte[] bytes = new byte[str.length() / 2];
for (int i = 0; i < str.length(); i+=2) {
char c = str.charAt(i);
bytes[i/2] = (byte) ((c - 'a') << 4);
c = str.charAt(i+1);
bytes[i/2] += (c - 'a');
}
return bytes;
}
}