나는이 제안에 @ 브라이언 애그뉴의 답변을 보완하기 위해 원 :
내가 대상이 약간 다른 동작을 필요로하는 경우를했다, 그래서 당신이에서와 마찬가지로 나는 익명의 내부 클래스와 그 기능을 확장 예. 외부 클래스는 GUI 애플리케이션이었고, 필자는 직렬화 할 필요가 없었기 때문에 @Brian이 말했듯이 익명의 내부 클래스는 확장 가능한 클래스가 있더라도 직렬화 할 수 없습니다.
이 경우에는 클래스를 deserialize하고 다시 serialize 할 때 다른 동작을 정의하기 만하면됩니다.특정 생성자를 가진 클래스가있는 경우, 클래스에서이 같은 방법을 사용하십시오
public FunctionalObject getNewFunctionalObject (String param1, String param2) {
// Use an anonymous inner class to extend the behavior
return new FunctionalObject (param1, param2) {
{
// Initialization block code here
}
// Extended behavior goes here
};
}
그래서 당신이 직렬화 복원 할 때, 당신은 전화 같이 할 수 있습니다 :
FunctionalObject fo = (FunctionalObject) objectInputStream.readObject();
fo = getNewFunctionalObject(fo.getParam1(), fo.getParam2());
직렬화, 이전 개체의 복제본 인 new
개체를 만들어야합니다. 일부 클래스에는이 동작이 내장되어 있으며, 다른 클래스에서는 특별히 정의해야합니다. 당신이 그것을 복제 할 수 있습니다 생성자가있는 경우 클래스가 정의 된 clone
방법이있는 경우 직렬화를 들어, 또는, 당신이 할 수 있습니다 :
는
objectOutputStream.writeObject (fo.clone());
그런 다음, 그 객체의 clone
는 더 이상 참조 할 수 없을 것이다 익명 내부 클래스가 아니라 객체의 실제 사본에 대한 참조이며 직렬화 할 수 있습니다. 귀하의 예제의 경우
, 당신은이 작업을 수행 할 수 :
HashMap
클래스
HashMap
그것으로 전달되는 어떤의 복제를 반환하는 생성자를 가지고 있기 때문에이 작동
// Assuming objectOutputStream has already been defined
Map<String, String> params = new HashMap<String, String>() {{
put("param1", "value1");
put("param2", "value2");
}};
objectOutputStream.writeObject (new HashMap<String,String> (params));
. 그것은 단순한 말을하기위한 많은 말 이었지만, 나는이 조언을 나 자신보다 빨리 나에게 가지기를 바랐다.
'static initialiser'는'instance initializer'를 의미합니까? –
그래서 예상되는 둘러싸는 클래스는 무엇입니까? – Shark
@ Eng.Fouad - whoops. 수정 됨 –