[求助]关于反序列化多个对象

Freefish1994 2016-08-23 10:44:58
序列化一个对象存到txt文件,然后反序列化这个没有问题。
可是在我重新运行程序时,再创建一个对象,然后序列化这个新对象并存到同一个txt文件中,这时候再反序列化时只能读取我第一个存入txt中的对象,后来重新运行程序时存进去的对象读不出来

我在网上也搜索过反序列化多个对象的方法,说是存到将多个对象存到一个Object[]中,可是这样实际还是读的时候读那一个数组
但是对于重新运行程序时再往里存对象如何读出来没有效果


有什么解决办法吗?


不知道我问题表达的是否清楚。。。
...全文
339 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Freefish1994 2016-08-25
  • 打赏
  • 举报
回复
引用 5 楼 rickylin86 的回复:
ObjectOutputStream默认情况下每次打开一个流的进行对象写入(可以写入多个对象)的时候都会写入一个头部信息,也就是writeStreamHeader(). 由于期待的结果是可以重复的写入对象.所以流会设置成append模式.如果采用默认的ObjectOutputStream实现的话那么结果将会是如下图: 所以要达到上面的需求的话那么首次写入StreamHeader,后续就没必要写入StreamHeader了. 所以需要重写自己的ObjectOutputStream类
我明白了。。谢谢您
Freefish1994 2016-08-25
  • 打赏
  • 举报
回复
引用 5 楼 rickylin86 的回复:
ObjectOutputStream默认情况下每次打开一个流的进行对象写入(可以写入多个对象)的时候都会写入一个头部信息,也就是writeStreamHeader(). 由于期待的结果是可以重复的写入对象.所以流会设置成append模式.如果采用默认的ObjectOutputStream实现的话那么结果将会是如下图: 所以要达到上面的需求的话那么首次写入StreamHeader,后续就没必要写入StreamHeader了. 所以需要重写自己的ObjectOutputStream类
我想知道的是,在我重写了writeStreamHeader方法以后,实现了加入多个对象只有一个头部信息,那么如果我关闭程序再运行的时候(文本里已经有了我上一次写入的多个对象),再往里面写入对象时还会有头部信息吗?
rickylin86 2016-08-24
  • 打赏
  • 举报
回复
ObjectOutputStream默认情况下每次打开一个流的进行对象写入(可以写入多个对象)的时候都会写入一个头部信息,也就是writeStreamHeader().
由于期待的结果是可以重复的写入对象.所以流会设置成append模式.如果采用默认的ObjectOutputStream实现的话那么结果将会是如下图:
所以要达到上面的需求的话那么首次写入StreamHeader,后续就没必要写入StreamHeader了.
所以需要重写自己的ObjectOutputStream类
Freefish1994 2016-08-24
  • 打赏
  • 举报
回复
引用 3 楼 rickylin86 的回复:

import java.io.Serializable;
import java.io.OutputStream;
import java.io.ObjectOutputStream;
import java.io.ObjectInputStream;
import java.io.IOException;

import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.Files;
import static java.nio.file.StandardOpenOption.*;

public class Person implements Serializable{

	private static final long serialVersionUID = 1L;

	public static void main(String[] args){
		Person person = new Person("张三",28,"男");
		writePeople(person);
		readPeople();
	}

	public Person(String name,int age,String sex){
		this.name = name;
		this.age = age;
		this.sex = sex;
	}

	@Override
	public String toString(){
		return String.format("person[name:%s,age:%d,sex:%s]",name,age,sex);
	}

	private static void readPeople(){
		try(ObjectInputStream in = new ObjectInputStream(Files.newInputStream(path,READ));){
			Person person = null;
			for(;;){
				person = (Person)(in.readObject());
				System.out.println(person);
			}
		}catch(IOException|ClassNotFoundException e){
			System.out.println("All print out");
		}
	}

	private static void writePeople(Person ... people){
		ObjectOutputStream file = null;//首次文件不存在.
		try{
			if(Files.isRegularFile(path)){
				file = new MyObjectOutputStream(Files.newOutputStream(path,WRITE,APPEND));
			}else{
				file = new ObjectOutputStream(Files.newOutputStream(path,CREATE,WRITE,APPEND));
			}
			for(Person person : people){
				file.writeObject(person);
			}
		}catch(IOException e){
			e.printStackTrace();
		}finally{
			try{
				file.close();
			}catch(IOException e){
				e.printStackTrace();
				System.exit(1);
			}
		}
	}

	private int age;
	private String name;
	private String sex;
	private static final Path path = Paths.get(System.getProperty("user.dir")).resolve("people.bin");
}

class MyObjectOutputStream extends ObjectOutputStream{

	public MyObjectOutputStream()throws IOException{
		super();
	}

	public MyObjectOutputStream(OutputStream out)throws IOException{
		super(out);
	}

	@Override
	public void writeStreamHeader(){

	}

}
不知道我理解的对不对啊,您的这个代码是不是只是一次输入多个对象时,只掉用一次ObjectOutputStream的writeStreamHeader方法,这样只有一个头文件信息 如果我关闭程序再运行时,是不是在输入多个对象时还会再产生一个头文件信息,也就是运行一次程序就会产生一次头文件信息?
rickylin86 2016-08-23
  • 打赏
  • 举报
回复
重写自己的ObjectOutputStream类.覆盖里面的writeStreamHeader方法.
rickylin86 2016-08-23
  • 打赏
  • 举报
回复

import java.io.Serializable;
import java.io.OutputStream;
import java.io.ObjectOutputStream;
import java.io.ObjectInputStream;
import java.io.IOException;

import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.Files;
import static java.nio.file.StandardOpenOption.*;

public class Person implements Serializable{

	private static final long serialVersionUID = 1L;

	public static void main(String[] args){
		Person person = new Person("张三",28,"男");
		writePeople(person);
		readPeople();
	}

	public Person(String name,int age,String sex){
		this.name = name;
		this.age = age;
		this.sex = sex;
	}

	@Override
	public String toString(){
		return String.format("person[name:%s,age:%d,sex:%s]",name,age,sex);
	}

	private static void readPeople(){
		try(ObjectInputStream in = new ObjectInputStream(Files.newInputStream(path,READ));){
			Person person = null;
			for(;;){
				person = (Person)(in.readObject());
				System.out.println(person);
			}
		}catch(IOException|ClassNotFoundException e){
			System.out.println("All print out");
		}
	}

	private static void writePeople(Person ... people){
		ObjectOutputStream file = null;//首次文件不存在.
		try{
			if(Files.isRegularFile(path)){
				file = new MyObjectOutputStream(Files.newOutputStream(path,WRITE,APPEND));
			}else{
				file = new ObjectOutputStream(Files.newOutputStream(path,CREATE,WRITE,APPEND));
			}
			for(Person person : people){
				file.writeObject(person);
			}
		}catch(IOException e){
			e.printStackTrace();
		}finally{
			try{
				file.close();
			}catch(IOException e){
				e.printStackTrace();
				System.exit(1);
			}
		}
	}

	private int age;
	private String name;
	private String sex;
	private static final Path path = Paths.get(System.getProperty("user.dir")).resolve("people.bin");
}

class MyObjectOutputStream extends ObjectOutputStream{

	public MyObjectOutputStream()throws IOException{
		super();
	}

	public MyObjectOutputStream(OutputStream out)throws IOException{
		super(out);
	}

	@Override
	public void writeStreamHeader(){

	}

}
Freefish1994 2016-08-23
  • 打赏
  • 举报
回复
引用 1 楼 rickylin86 的回复:
重写自己的ObjectOutputStream类.覆盖里面的writeStreamHeader方法.
重写writeStreamHeader()方法的类有一个子类,这个子类因为父类继承ObjectOutputStream类不能创建静态对象了。。。 这咋办。。。本身代码有点多。写了一段儿举了个简化的例子,第17行报错。。。
public class Test7 {
	public static void main(String[] args) {
	}
}

class Person1 extends ObjectOutputStream {
	public Person1() throws IOException {
		super();
	}
}

class Person2 extends Person1 {
	private Person2() throws IOException {
		super();
	}

	public static Person2 p2 = new Person2();
}

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧