0

Я старался очень простой 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» будет сериализован с большим количеством данных и метаданных.

+0

Слишком много, чтобы перечислить здесь. Названия классов, глубина наследования, количество полей, имена полей, содержимое полей, ... См. [Протокол потоковой передачи Serialization] (https://docs.oracle.com/javase/7/docs/platform/serialization/spec/ protocol.html). – EJP

+0

@EJP Мне так интересно узнать о «глубине наследования» во время процесса сериализации, не могли бы вы ПОЧТИ разработать поведение всех супертипов (линейно), ни один из которых не может быть сериализуемым, когда сериализуемый подтип сериализуется. Я пробовал этот сценарий, и все идет хорошо, мне никогда не приходилось делать какие-либо реализации специальных методов, а именно: private void writeObject (java.io.ObjectOutputStream out) throws IOException private void readObject (java.io.ObjectInputStream in) throws IOException, ClassNotFoundException; ' Пожалуйста, объясните, спасибо заранее. –

ответ

1

Я думаю, что это имя. Символ сохраняется в байте, а последний класс имеет имя с тремя буквами больше и еще 3 байта. Обратите внимание, что это может быть совпадением в том, что я не очень разбираюсь в сериализации.

Сериализация касается экземпляров экземпляра, который имеет отношение только к переменным этого класса, поскольку они определяют состояние класса. Когда переменные загружаются, экземпляр тот же, потому что он действует одинаково с текущими переменными, чего мы хотим.

+0

Действительно, кажется, что имя класса отвечает за дополнительные 3 байта. Итак, приходя к актуальному предметному вопросу, какие факторы определяют фактический размер файла, когда объект Java сериализуется. –

+0

Последний абзац не имеет большого смысла. Попробуйте переписать его. – EJP