Задать вопрос
@artemfisher

Почему методы writeReplace и readResolve не работают в Externalizable?

Добрый день!
В документации сказано, что методы writeReplace и readResolve могут использоваться для Serializable и Externalizable. Для Serializable они вызываются, но для Externalizable нет. В чем причина?

public class Person implements Externalizable{
	
	private final long serialVersionUID = 1;
	
	String name;
	int age;
	
	Person(){}
	
	Person(String name, int age)
	{
		this.name = name;
		this.age = age;
	}
	
	@Override
	public String toString()
	{
		return this.name + " " + this.age;
	}
	
	@Override
	public void writeExternal(ObjectOutput out) throws IOException
	{
		out.writeUTF(name);
		out.writeInt(age);
	}
	
	@Override
	public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException
	{
		this.name = in.readUTF();
		this.age = in.readInt();
	}
		
	
	private Object readResolve() throws ObjectStreamException
	{
		System.out.println("readResolve");
		
		return null;
	}
	
	private Object writeReplace() throws ObjectStreamException
	{
		System.out.println("writeReplace");
		return new Person("test",0);
	}	
}


try(FileOutputStream fos = new FileOutputStream("ser.txt");
		ObjectOutputStream oos = new ObjectOutputStream(fos))
{
	Person p = new Person("Bob", 18);
						
	p.writeExternal(oos);			
}
		
try(FileInputStream fis = new FileInputStream("ser.txt");
		ObjectInputStream ois = new ObjectInputStream(fis))
{
	Person p = new Person();
	p.readExternal(ois);
			
	System.out.println(p);
}


Все равно выведет: Bob 18
  • Вопрос задан
  • 31 просмотр
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Mercury13
Программист на «си с крестами» и не только
Потому что вы не предоставили места для вызова этих функций.
А говорит оно вот о чём. При стандартном механизме записи объектов средствами ObjectOuputStream/Serializable система проверяет, объект Externalizable или нет, и если он Externalizable, то использует его методы.

Надо использовать oos.writeObject(p), и аналогично для второй части.

Externalizable — редкий класс, и обычно используется в таких случаях:
• Чтобы сэкономить место — стандартная сериализация методом рефлексии, прописанная в ObjOutStream, создаёт много метаданных.
• Чтобы зашифровать критические данные.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы