Почему этот класс не сериализуется?
-
20-09-2019 - |
Вопрос
Я использовал реализацию Mersenne-Twister в http://www.math.sci.hiroshima-u.ac.jp/~m-mat/mt/versions/java/mtrandom.java в качестве замены по умолчанию java.util.Random
учебный класс. Тем не менее, четыре поля (Int, логический и два байта []) отмечены как transient
. Анкет Это означает, что я не могу сериализовать объект этого класса без реализации пользовательской функциональности.
Вопрос в том, есть ли причина, по которой эти поля отмечены переходными? Есть ли там код, который содержит информацию, которая не имеет никакого смысла, когда объект читается из файла? Я удалил transient
Модификатор с полей, и он, кажется, работает нормально, но я не тестировал его интенсивно, и могут ли есть случаи, когда он ломается?
Лично я не могу понять, почему, так как все, что делается в классе, является арифметикой.
Решение
Скорее всего, обоснование создания все нестатических полей класса transient
было так, чтобы MTRandom
класс остается бинарным совместимым с java.util.Random
, из которого он расширен.
Таким образом, теоретически вы можете сериализировать MTRandom
экземпляр и десериализуйте его как Random
экземпляр и все будет работать.
Если эти поля не transient
, тогда они будут сериализованы и станут несовместимыми.
Однако, насколько я могу судить, удаление переходных процессов не должно вызывать проблемы для вас.
Другие советы
Из комментария serialVersionUID
, Похоже, автор не хотел рассматривать сериализацию. Добавление transient
Возможно, подавили некоторые предупреждения компилятора/IDE.