행운을 빌어 요, 나는 다음과 같은 코드를 사용하여 구현하는 관리해야 : 당신은 또한하는 readClassDescriptor을 오버라이드 (override) 할 필요가
public static ObjectInputStream getSwapOIS(InputStream in ,String fromClass,String toClass)
throws IOException ,ClassNotFoundException {
final String from="^"+fromClass,fromArray="^\\[L"+fromClass,toArray="[L"+toClass;
return new ObjectInputStream(in) {
protected Class<?> resolveClass(ObjectStreamClass desc)
throws IOException, ClassNotFoundException
{
String name = desc.getName().replaceFirst(from, toClass);
name = name.replaceFirst(fromArray, toArray);
return Class.forName(name);
}
protected ObjectStreamClass readClassDescriptor()
throws IOException, ClassNotFoundException
{
ObjectStreamClass cd = super.readClassDescriptor();
String name = cd.getName().replaceFirst(from, toClass);
name = name.replaceFirst(fromArray, toArray);
if(!name.equals(cd.getName())) {
cd = ObjectStreamClass.lookup(Class.forName(name));
}
return cd;
}
};
}
주(). 표준 유형과 배열 모두에서 작동하며 패키지 이름뿐 아니라 클래스 이름도 변경할 수 있습니다. 그냥 수행 com.oldPackage 교체) 1 : 열거 형의 이름 com.oldPackage.Person이고 새 이름은 내가 직렬화 된 데이터로 대체해야 다른 어떤 com.newPack.Person입니다
InputStream in = new ByteArrayInputStream(classBytes);
ObjectInputStream ois = getSwapOIS( in,
"com.oldpackage.className",
"com.newpackage.newClassName");
Object myObject= ois.readObject();
합니다. com.newPack.Person이있는 사람 2) com/oldPackage/Person을 com/newPack/Person으로 바꿉니다. – ChrisOdney
com.oldPackage라는 클래스가 있으므로 com/oldPackage/Person을 com/newPack/Person으로 바꿉니다.위의 작업에 영향을받는 PersonDetails가 있다면 다음을 수행합니다. 3) com.newPack.PersonDetails (결과 1)을 com.oldPackage.PersonDetails 으로 바꿉니다. 4) com/newPack/PersonDetails ((2)) with com/oldPackage/PersonDetails 누락 된 항목이 있으면 알려주세요. – ChrisOdney