Я старался очень простой Java-сериализации двух экземпляров разного типа. Вот классовая структура первого типа Java:Какие факторы определяют размер файла, когда Java-объект сериализован?
class Ancestor {
int ai = 1;
String as = "abc";
}
class DescendentSer extends Ancestor implements java.io.Serializable{
int diser = 2;
String dsser = "xyz";
@Override
public String toString(){
return diser + " " + dsser + " " +ai+" "+as ;
}
}
Я пытаюсь сериализации «DescendentSer» с помощью следующего фрагмента кода:
FileOutputStream fos = new FileOutputStream("C:\\CoreCod\\serial.dat");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(new DescendentSer());
oos.flush();
oos.close();
При сериализации завершается размер «serial.dat» файл составляет 117 байт. Тогда я пытаюсь сериализации другой экземпляр, структура класса выглядит следующим образом:
class IndDescendentSer implements java.io.Serializable{
int diser = 2;
String dsser = "xyz";
@Override
public String toString(){
return diser + " " + dsser ;
}
}
Код сериализации для сериализации «IndDescendentSer» точно так же, как описано выше (за исключением того, что имя файла, в который экземпляр объекта будет сериализован, и экземпляр, который будет сериализован, изменился ранее). Однако размер сериализованного файла на этот раз составляет 120 байт.
Как возможно, что на этот раз байты, содержащиеся в этом сериализованном файле, больше, чем более старые, особенно когда экземпляр «IndDescendentSer» является прямым потомком класса Object, тогда как «DescendentSer» имел свой супертип - Предка ". И, следовательно, ожидалось, что «DescendentSer» будет сериализован с большим количеством данных и метаданных.
Слишком много, чтобы перечислить здесь. Названия классов, глубина наследования, количество полей, имена полей, содержимое полей, ... См. [Протокол потоковой передачи Serialization] (https://docs.oracle.com/javase/7/docs/platform/serialization/spec/ protocol.html). – EJP
@EJP Мне так интересно узнать о «глубине наследования» во время процесса сериализации, не могли бы вы ПОЧТИ разработать поведение всех супертипов (линейно), ни один из которых не может быть сериализуемым, когда сериализуемый подтип сериализуется. Я пробовал этот сценарий, и все идет хорошо, мне никогда не приходилось делать какие-либо реализации специальных методов, а именно: private void writeObject (java.io.ObjectOutputStream out) throws IOException private void readObject (java.io.ObjectInputStream in) throws IOException, ClassNotFoundException; ' Пожалуйста, объясните, спасибо заранее. –