public class Solution implements Serializable {
public static void main(String[] args) throws IOException, ClassNotFoundException {
System.out.println(new Solution(4));
ObjectOutputStream objOS = new ObjectOutputStream(new FileOutputStream("templ.bin"));
Solution savedObject = new Solution(4);
objOS.writeObject(savedObject);
objOS.flush();
objOS.close();
Solution loadedObject = new Solution(10);
System.out.println(loadedObject);
ObjectInputStream objectIS = new ObjectInputStream(new FileInputStream("templ.bin"));
loadedObject = (Solution) objectIS.readObject();
System.out.println(loadedObject);
if (savedObject.string.equals(loadedObject.string))
System.out.println("Strings are equal");
}
private final transient String pattern = "dd MMMM yyyy, EEEE";
private transient Date currentDate;
private transient int temperature;
String string;
public Solution(int temperature) {
this.currentDate = new Date();
this.temperature = temperature;
string = "Today is %s, and current temperature is %s C";
SimpleDateFormat format = new SimpleDateFormat(pattern);
this.string = String.format(string, format.format(currentDate), temperature);
}
@Override
public String toString() {
return this.string;
}
}
Станислав
26 уровень
Почему при использовании transient я получаю абсолютно индентичный объект
Решен
Комментарии (11)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Дмитрий
2 января 2020, 20:52
Если сравнивать объекты так :(Solution) in.readObject(); - выводит false.
Если сравнивать только по полю, которое сериализуем, то все в порядке:
loadObject.toString().equals(savedObject.toString()) - выводит true, как и положено.
----------------------------------------------------------------------------
Так как поле string получается из значений других полей, можно сохранять только его.
При сравнении если поля string одинаковые, соответственно и температура у объектов была тоже одинаковой.
+1
Veryprosto
8 сентября 2019, 15:13
замени
if (savedObject.string.equals(loadedObject.string))
System.out.println("Strings are equal");
на
на if (savedObject.equals(loadedObject))
System.out.println("Objects are equal");
вот тогда и будет настоящий тест, который учитывает время создания каждого объекта
0
Мишаня
31 июля 2019, 14:51полезный
Я для проверки добавил метод
+4
Илья Черный
27 октября 2018, 11:20
А зачем мы создаем еще один Solution с другим параметром? Мы же его нигде не используем
В данном коде это:
Solution newObject = new Solution(6);
0
Konstantin
13 августа 2019, 17:49
Мне показалось, что проверка была вот для чего:
1) создали savedObject
2) записали в файл
3) считали записанный объект (savedObject) и получили loadedObject
4) сравнили их - они одинаковые. (ну еще бы! взяли объект, записали его в файл и потом его же считали.)
5) берем считанные объект loadedObject (он же savedObject) сравниваем с newObject - и они разные.
Вот только про последнее в инструкции ничего не сказано.
можно прописать: System.out.println(loadedObject.string.equals(newObject.string));
получим false.
На этом я получил от задачи то, что хотел, пошел дальше довольный. Может где-то я что-то понял не так.
0
Logikarma
2 августа 2018, 21:36
У тебя сравнивается только поле "string"
0
iOSif_StyleIN Android Developer в Уральский процессинг
3 апреля 2018, 14:33решение
странно, у меня объекты не эквиваленты! equals не true!
+4
Иван Лаврентьев
24 февраля 2018, 21:08
у меня тоже непонимание полное...
пишу Solution savedObject = new Solution(5) в файл, температура помечена transient (не участвует в сериализации), открываю файл - вижу там значение температуры...
значение поля температура не должно же было сериализовать, почему она там оказалась?
0
Kirill
24 марта 2018, 12:08
если посмотреть в записанный файл, то увидите там только string, а вот параметров помеченных как transient вы там не найдете.
Эти параметры были записаны в string и сохранены в файл :)
+2
Pavlo Plynko Java-разработчик в CodeGym Expert
5 января 2018, 16:47
Добавь в формат даты миллисекунды, например: "SS dd MMMM yyyy, EEEE"
тогда увидишь отличия.
0
Стас Пасинков Software Developer в Zipy Master
5 января 2018, 01:53
не очень понятно что вам не нравится)
transient поля у вас не учитываются в сравнении, так же, как и в методе toString()
поэтому вам может казаться, что объекты идентичны. а идентичны только значения поля string в них.
объясните детальней что не так?
+1