Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.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 如何在android中序列化视图对象_Java_Android - Fatal编程技术网

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实现不可序列化,那么您的一个可能不可序列化。持久化视图听起来是个坏主意,也许使用而不是你不能序列化一个视图类,这在理论上是不可能的,但是上下文在反序列化后可能无效。