Java 通过序列化检索对象
我试图序列化一个对象,该对象引用另一个对象作为实例变量。我遵循常见的方法,但是我不能在main()方法中检索第二个对象(不可序列化)。这是我的密码:Java 通过序列化检索对象,java,string,object,serialization,Java,String,Object,Serialization,我试图序列化一个对象,该对象引用另一个对象作为实例变量。我遵循常见的方法,但是我不能在main()方法中检索第二个对象(不可序列化)。这是我的密码: public class Car { String type; int speed; public Car(String s, int v){ type = s; speed = v; } } } 在主要方法中: public static void main(String[] args) { Car c = ne
public class Car {
String type;
int speed;
public Car(String s, int v){
type = s;
speed = v;
}
}
}
在主要方法中:
public static void main(String[] args) {
Car c = new Car("noType", 100);
Employee e = new Employee("Aris", 1, c);
try {
FileOutputStream fo = new FileOutputStream("save.txt");
ObjectOutputStream out = new ObjectOutputStream(fo);
out.writeObject(e);
out.close();
} catch (IOException e1) {
e1.printStackTrace();
}
try {
FileInputStream fi = new FileInputStream("save.txt");
ObjectInputStream in = new ObjectInputStream(fi);
Employee emp = (Employee) in.readObject(); // Comment
System.out.println(emp.car.speed);
in.close();
}catch (ClassNotFoundException e1) {
e1.printStackTrace();
}
catch (IOException e1) {
e1.printStackTrace();
}
}
在第二个try块的“Comment”行上,它抛出一个nullPointerException。它无法以这种方式保存汽车对象。我该怎么做才能克服它?当然,我希望汽车类保持非系列化。如果希望保存Car对象的instrance变量并借助它们及其构造函数重新创建它,如何保存(并检索)String属性
更新:
当试图只保存int实例变量时,它会起作用。这一次的相关方法是:
private void writeObject(ObjectOutputStream os){
try {
os.defaultWriteObject();
os.writeInt(car.speed);
} catch (IOException e) {
e.printStackTrace();
}
}
private void readObject(ObjectInputStream is){
try {
is.defaultReadObject();
car = new Car("theNew", is.readInt());
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
但我的问题仍然是如何(或是否)保存整个对象。毕竟,我没有成功地保存和检索字符串。WriteString(),ReadString()方法
不存在 线路
car = (Car)is.readObject();
这是错误的。
汽车是不可序列化的
解决方案:
另见
使用解决方案4编写代码:
private void writeObject(ObjectOutputStream os){
try {
os.defaultWriteObject();
os.writeObject(car.type);
os.writeInt(car.speed);
} catch (IOException e) {
e.printStackTrace();
}
}
private void readObject(ObjectInputStream is){
try {
is.defaultReadObject();
String type = (String) is.readObject();
int speed = is.readInt();
this.car = new Car(type, speed);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
我们可以知道为什么在您尝试序列化或至少反序列化汽车时,您不希望汽车是可序列化的吗?这只是一个示例代码。假设我没有访问类的权限,所以我不能修改它的代码。好吧,这并不是说你们不想,而是你们不能使它可序列化。但是您可以编写一个可序列化的类来获取所有参数,对吗?在序列化时,您将序列化该文件。在反序列化时,您使用该替代品创建了一辆汽车?请参见下面的我的ANWR,使用os.writeObject();用完整代码再次更新了我的答案我认为defaultReadObject指的是Employee对象。我正试图保存和检索这个对象。@AlexWien:Car类是瞬态的,如果不是,则无所谓serializable@Bhavik沙阿,你错了,现在是第二次了,所以请取消你的否决票:一门课永远不会是暂时的!!,成员车是暂时的,它不像他那样在自序列化中发挥作用@亚历克斯维恩:OP正在试图将Employee对象存储到文件中,而不是存储到Car中。由于Employee对象中的Car变量是暂时的,所以不管类Car是可序列化的还是notAnyway类Car不能序列化的。这就是我问题的重点。如何正确地实现readObject()、writeObject()方法来检索汽车。我几乎可以肯定这是可以做到的。我在我的更新中显示,通过一个简单的int变量,它可以工作。
private void writeObject(ObjectOutputStream os){
try {
os.defaultWriteObject();
os.writeObject(car.type);
os.writeInt(car.speed);
} catch (IOException e) {
e.printStackTrace();
}
}
private void readObject(ObjectInputStream is){
try {
is.defaultReadObject();
String type = (String) is.readObject();
int speed = is.readInt();
this.car = new Car(type, speed);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}