Java 如何在android中序列化视图对象
我有一个视图对象需要序列化以存储在数据库中,然后在以后检索Java 如何在android中序列化视图对象,java,android,Java,Android,我有一个视图对象需要序列化以存储在数据库中,然后在以后检索 public class MachineView extends View implements Serializable { String name; int age; public MachineView(String name, int age, Context context) { super(context); this.name = name; t
public class MachineView extends View implements Serializable {
String name;
int age;
public MachineView(String name, int age, Context context) {
super(context);
this.name = name;
this.age = age;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
int x = getWidth();
int y = getHeight();
int radius;
radius = 50;
Paint paint = new Paint();
//paint.setStyle(Paint.Style.FILL);
paint.setTextSize(x / 2);
...
}
}
唯一的问题是,我用来序列化对象的方法只适用于简单对象(即可以压缩为键值对的对象)
下面是序列化和读取对象方法:
//Serialize object
public static byte[] getSerializedObject(Serializable s) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = null;
try {
oos = new ObjectOutputStream(baos);
oos.writeObject(s);
} catch (IOException e) {
return null;
} finally {
try {
oos.close();
} catch (IOException e) {}
}
byte[] result = baos.toByteArray();
return result;
}
//read object
public static Object readSerializedObject(byte[] in) {
Object result = null;
ByteArrayInputStream bais = new ByteArrayInputStream(in);
ObjectInputStream ois = null;
try {
ois = new ObjectInputStream(bais);
result = ois.readObject();
} catch (Exception e) {
result = null;
} finally {
try {
ois.close();
} catch (Throwable e) {
}
}
return result;
}
似乎我可以将该对象转换为字节数组,但每次我读回该对象时,它都返回空值您的代码对我来说很好:
import java.io.*;
class Foo implements Serializable {
@Override public String toString() {
return "Foo [x="+x+"]";
}
int x;
}
class Bar implements Serializable {
@Override public String toString() {
return "Bar [foo="+foo+"]";
}
Foo foo;
}
public class Soxx {
public static byte[] getSerializedObject(Serializable s) {
ByteArrayOutputStream baos=new ByteArrayOutputStream();
ObjectOutputStream oos=null;
try {
oos=new ObjectOutputStream(baos);
oos.writeObject(s);
} catch(IOException e) {
return null;
} finally {
try {
oos.close();
} catch(IOException e) {}
}
byte[] result=baos.toByteArray();
return result;
}
//read object
public static Object readSerializedObject(byte[] in) {
Object result=null;
ByteArrayInputStream bais=new ByteArrayInputStream(in);
ObjectInputStream ois=null;
try {
ois=new ObjectInputStream(bais);
result=ois.readObject();
} catch(Exception e) {
result=null;
} finally {
try {
ois.close();
} catch(Throwable e) {}
}
return result;
}
public static void main(String[] args) {
Foo foo=new Foo();
foo.x=42;
Bar bar=new Bar();
bar.foo=foo;
byte[] bytes=getSerializedObject(bar);
Object object=readSerializedObject(bytes);
System.out.println(object);
}
}
输出:Bar[foo=foo[x=42]您的代码对我来说很好:
import java.io.*;
class Foo implements Serializable {
@Override public String toString() {
return "Foo [x="+x+"]";
}
int x;
}
class Bar implements Serializable {
@Override public String toString() {
return "Bar [foo="+foo+"]";
}
Foo foo;
}
public class Soxx {
public static byte[] getSerializedObject(Serializable s) {
ByteArrayOutputStream baos=new ByteArrayOutputStream();
ObjectOutputStream oos=null;
try {
oos=new ObjectOutputStream(baos);
oos.writeObject(s);
} catch(IOException e) {
return null;
} finally {
try {
oos.close();
} catch(IOException e) {}
}
byte[] result=baos.toByteArray();
return result;
}
//read object
public static Object readSerializedObject(byte[] in) {
Object result=null;
ByteArrayInputStream bais=new ByteArrayInputStream(in);
ObjectInputStream ois=null;
try {
ois=new ObjectInputStream(bais);
result=ois.readObject();
} catch(Exception e) {
result=null;
} finally {
try {
ois.close();
} catch(Throwable e) {}
}
return result;
}
public static void main(String[] args) {
Foo foo=new Foo();
foo.x=42;
Bar bar=new Bar();
bar.foo=foo;
byte[] bytes=getSerializedObject(bar);
Object object=readSerializedObject(bytes);
System.out.println(object);
}
}
输出:Bar[foo=foo[x=42]]它适用于简单对象,但我的类扩展了视图类,我得到了一个空对象。我得到一个:'Exception in thread“main”java.lang.NullPointerException at java.io.ByteArrayInputStream。(ByteArrayInputStream.java:106)at Soxx.readSerializedObject(Soxx.java:36)at Soxx.main(Soxx.java:56)'如果我使Foo无法实现序列化,那么您的其中一个可能无法序列化。持久化视图听起来是个坏主意,可能使用INSTEAD您无法序列化视图类,这在理论上是不可能的,但上下文在反序列化后可能无效以供使用。它适用于简单对象,但我的类扩展了视图类,我得到了一个空对象。我得到一个:“线程中的异常”mainjava.io.ByteArrayInputStream.(ByteArrayInputStream.java:106)的java.lang.NullPointerException(java:106)的Soxx.main(Soxx.java:36)的readSerializedObject(Soxx.java:36)的java.lang.NullPointerException(Soxx.java:56)“如果我使Foo实现不可序列化,那么您的一个可能不可序列化。持久化视图听起来是个坏主意,也许使用而不是你不能序列化一个视图类,这在理论上是不可能的,但是上下文在反序列化后可能无效。