Расширенный контроль: writeObject, readObject, readResolve
writeObject и readObject
Класс может переопределить поведение сериализации, объявив приватные методы:
JVM вызывает эти методы через рефлексию, если они объявлены. Метод
Этот паттерн позволяет сериализовать
readResolve
Метод
Без
writeReplace
Аналогично,
Этот паттерн рекомендуется Джошуа Блохом (Joshua Bloch) в "Effective Java" как предпочтительный способ сериализации сложных объектов
#Java #для_новичков #beginner #IO #NIO #Serialize
writeObject и readObject
Класс может переопределить поведение сериализации, объявив приватные методы:
private void writeObject(ObjectOutputStream out) throws IOException;
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException;
JVM вызывает эти методы через рефлексию, если они объявлены. Метод
writeObject вызывается после записи дескриптора класса, но перед записью полей. Внутри него можно выполнить out.defaultWriteObject() (записать стандартные поля) и затем дописать произвольные данные.public class SecureDocument implements Serializable {
private static final long serialVersionUID = 1L;
private String title;
private transient String secretContent; // не сериализуем напрямую
private void writeObject(ObjectOutputStream out) throws IOException {
out.defaultWriteObject(); // записываем title и другие нетранзиентные поля
// Шифруем секретный контент перед записью
String encrypted = encrypt(secretContent);
out.writeUTF(encrypted);
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject(); // читаем title
// Дешифруем секретный контент
String encrypted = in.readUTF();
this.secretContent = decrypt(encrypted);
}
private String encrypt(String data) { /* ... */ return data; }
private String decrypt(String data) { /* ... */ return data; }
}Этот паттерн позволяет сериализовать
transient-поля в зашифрованном виде, выполнять валидацию инвариантов, восстанавливать производные структуры.readResolve
Метод
readResolve вызывается после полной десериализации объекта и позволяет заменить десериализованный экземпляр на другой объект. Это критично для реализации singleton и enum-like паттернов.Singleton — это порождающий паттерн проектирования, гарантирующий, что класс имеет только один экземпляр, и предоставляющий глобальную точку доступа к нему. При десериализации singleton механизм создаёт новый объект, нарушая гарантию единственности. readResolve возвращает существующий экземпляр.
public class Singleton implements Serializable {
private static final long serialVersionUID = 1L;
private static final Singleton INSTANCE = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return INSTANCE;
}
// При десериализации возвращаем существующий INSTANCE, а не новый объект
private Object readResolve() {
return INSTANCE;
}
}Без
readResolve десериализация Singleton создала бы новый объект в куче, и getInstance() вернул бы старый INSTANCE, в то время как десериализованный объект — отдельная сущность. readResolve гарантирует, что любая десериализация вернёт канонический экземпляр.writeReplace
Аналогично,
writeReplace вызывается перед сериализацией и позволяет заменить объект на другой перед записью в поток. Используется для прокси-сериализации (serialization proxy pattern), когда внутреннее представление объекта не должно попадать в поток.Прокси-сериализация (serialization proxy pattern) — это паттерн, при котором вместо самого объекта сериализуется лёгкий прокси-объект (proxy), содержащий только необходимые данные, а при десериализации прокси через readResolve восстанавливает оригинальный объект через его конструктор или фабрику. Это защищает инварианты, предотвращает создание "сырых" объектов и позволяет менять внутреннюю структуру класса, не ломая совместимость.
public class ComplexObject implements Serializable {
private static final long serialVersionUID = 1L;
private final int x;
private final int y;
// инвариант: x >= 0 && y >= 0
public ComplexObject(int x, int y) {
if (x < 0 || y < 0) throw new IllegalArgumentException();
this.x = x;
this.y = y;
}
// Вместо себя сериализуем прокси
private Object writeReplace() {
return new SerializationProxy(x, y);
}
// Запрещаем десериализацию ComplexObject напрямую
private void readObject(ObjectInputStream in) throws InvalidObjectException {
throw new InvalidObjectException("Proxy required");
}
private static class SerializationProxy implements Serializable {
private static final long serialVersionUID = 1L;
private final int x;
private final int y;
SerializationProxy(int x, int y) {
this.x = x;
this.y = y;
}
// При десериализации прокси восстанавливаем ComplexObject через конструктор
private Object readResolve() {
return new ComplexObject(x, y); // инвариант проверяется!
}
}
}Этот паттерн рекомендуется Джошуа Блохом (Joshua Bloch) в "Effective Java" как предпочтительный способ сериализации сложных объектов
#Java #для_новичков #beginner #IO #NIO #Serialize
👍4
Что выведет код?
#Tasks
import java.io.*;
public class Task310726 {
static class DataV1 implements Serializable {
private static final long serialVersionUID = 1L;
String name = "John";
}
static class DataV2 implements Serializable {
private static final long serialVersionUID = 1L;
String fullName;
}
public static void main(String[] args) throws Exception {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try (ObjectOutputStream oos = new ObjectOutputStream(baos)) {
oos.writeObject(new DataV1());
}
byte[] bytes = baos.toByteArray();
try (ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bytes))) {
DataV2 obj = (DataV2) ois.readObject();
System.out.println(obj.fullName);
} catch (Exception e) {
System.out.println(e.getClass().getSimpleName());
}
}
}
#Tasks
👍2
👍2
Что такое 🤓
Ответ:
Collectors.toMap(Function keyMapper, Function valueMapper, BinaryOperator mergeFunction) собирает стрим в Map.
Если возникают дублирующиеся ключи, нужно передать mergeFunction для разрешения конфликта.
Пример: list.stream ().collect(Collectors.toMap(Item::getId, Function.identity(), (oldVal, newVal) -> newVal)) — при конфликте берется новое значение.
Также можно указать Supplier для конкретной реализации Map. Без mergeFunction конфликт вызовет IllegalStateException.
#собеседование
Collectors.toMap() и как разрешать конфликты ключей? Ответ:
Collectors.toMap(Function keyMapper, Function valueMapper, BinaryOperator mergeFunction)
Если возникают дублирующиеся ключи, нужно передать mergeFunction для разрешения конфликта.
Пример:
Также можно указать Supplier для конкретной реализации Map. Без mergeFunction конфликт вызовет IllegalStateException.
#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
История технологии сегодня — 01 августа
ℹ️ Кто родился в этот день
Дуглас Дин Оше́ров (англ. Douglas Dean Osheroff; род. 1 августа 1945, Абердин, Вашингтон, США) — американский физик, лауреат Нобелевской премии по физике в 1996 г. (совместно с Дэвидом Ли и Робертом Ричардсоном) «за открытие сверхтекучести гелия-3». Открытие было сделано в 1971 году, когда Ошеров был аспирантом в Корнеллском университете.
Жорж Шарпа́к (фр. Georges Charpak, в семье и среди знакомых — Гриша Шарпак; 1 августа 1924 — 29 сентября 2010) — французский физик, лауреат Нобелевской премии по физике в 1992 году «за открытие и создание детекторов частиц, в частности многопроволочной пропорциональной камеры».
🌐 Знаковые события
1774 — английским учёным Джозефом Пристли открыт химический элемент кислород.
#Biography #Birth_Date #Events #01августа
Дуглас Дин Оше́ров (англ. Douglas Dean Osheroff; род. 1 августа 1945, Абердин, Вашингтон, США) — американский физик, лауреат Нобелевской премии по физике в 1996 г. (совместно с Дэвидом Ли и Робертом Ричардсоном) «за открытие сверхтекучести гелия-3». Открытие было сделано в 1971 году, когда Ошеров был аспирантом в Корнеллском университете.
Жорж Шарпа́к (фр. Georges Charpak, в семье и среди знакомых — Гриша Шарпак; 1 августа 1924 — 29 сентября 2010) — французский физик, лауреат Нобелевской премии по физике в 1992 году «за открытие и создание детекторов частиц, в частности многопроволочной пропорциональной камеры».
1774 — английским учёным Джозефом Пристли открыт химический элемент кислород.
#Biography #Birth_Date #Events #01августа
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Всем привет! 😉
Опубликовал еще пару статей на devforge.ru
Пагинация, которую начинаешь ненавидеть 😵
Как я память искал
Поправил мобильное отображение статей. Должно быть комфортно читать)))
Проверяйте))
Если не сложно напишите хоть одно слово о том как вам?☺️
Опубликовал еще пару статей на devforge.ru
Пагинация, которую начинаешь ненавидеть 😵
Как я память искал
Поправил мобильное отображение статей. Должно быть комфортно читать)))
Проверяйте))
Если не сложно напишите хоть одно слово о том как вам?
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4
This media is not supported in your browser
VIEW IN TELEGRAM
Я, который решил добавить в прод либу о которой много пишут в интернете🤣
🤣5🔥1
Java for Beginner
Всем привет! 😉 Опубликовал еще пару статей на devforge.ru Пагинация, которую начинаешь ненавидеть 😵 Как я память искал Поправил мобильное отображение статей. Должно быть комфортно читать))) Проверяйте)) Если не сложно напишите хоть одно слово о том…
Вот как надо было🤣 и че я с мобилкой замарачивался🤪
🤣2👍1🔥1🤓1
История технологии сегодня — 02 августа
ℹ️ Кто родился в этот день
Элайша Грей (другой вариант имени в русских источниках: Элиша, англ. Elisha Gray; 2 августа 1835, Барнсвилл, Огайо — 21 января 1901, Ньютонвилл, Мидлсекс) — американский инженер-электрик, соучредитель компании Western Electric Manufacturing Company. Элайша Грей также считается отцом современного музыкального синтезатора, и получил более 70 патентов на свои изобретения. Он был одним из основателей Graybar, приобретя контрольный пакет акций компании вскоре после её создания.
Сэ́мюэл Ду́нкан Блэк (англ. Samuel Duncan Black, более известный как С. Дункан Блэк (англ. S. Duncan Black); 1883—1951) — американский предприниматель и изобретатель, вместе с Алонзо Дж. Деккером основавший компанию по производству инструментов Black & Decker. Известность они приобрели благодаря совместной разработке пистолетной рукоятки и спускового переключателя для переносных электрических дрелей, а также универсального двигателя для переносных электроинструментов.
🌐 Знаковые события
1932 — Карл Андерсон сделал снимок со следом античастицы позитрон.
2020 — космический корабль Dragon 2 компании SpaceX впервые совершил посадку после космического полёта с астронавтами в миссии SpaceX DM-2.
#Biography #Birth_Date #Events #02августа
Элайша Грей (другой вариант имени в русских источниках: Элиша, англ. Elisha Gray; 2 августа 1835, Барнсвилл, Огайо — 21 января 1901, Ньютонвилл, Мидлсекс) — американский инженер-электрик, соучредитель компании Western Electric Manufacturing Company. Элайша Грей также считается отцом современного музыкального синтезатора, и получил более 70 патентов на свои изобретения. Он был одним из основателей Graybar, приобретя контрольный пакет акций компании вскоре после её создания.
Сэ́мюэл Ду́нкан Блэк (англ. Samuel Duncan Black, более известный как С. Дункан Блэк (англ. S. Duncan Black); 1883—1951) — американский предприниматель и изобретатель, вместе с Алонзо Дж. Деккером основавший компанию по производству инструментов Black & Decker. Известность они приобрели благодаря совместной разработке пистолетной рукоятки и спускового переключателя для переносных электрических дрелей, а также универсального двигателя для переносных электроинструментов.
1932 — Карл Андерсон сделал снимок со следом античастицы позитрон.
2020 — космический корабль Dragon 2 компании SpaceX впервые совершил посадку после космического полёта с астронавтами в миссии SpaceX DM-2.
#Biography #Birth_Date #Events #02августа
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Ребят, напоминаю, набираю желающих обучиться Java!
Карьерным консультантом не работаю, но до уровня крепкого мидла с Spring доведу.
Что изучаем: Spring Boot, Spring Security, Spring Data, OAuth2, FeignClient, Specification, Pageable, WebClient, PostgreSQL, Redis, Hibernate, REST API, Caffeine, JUnit, Mockito, WireMock, Zonky, Kafka, Apache Common и так далее. Но тут не все))
Кроме того могу провести мок-интервью или проверить ваш пет-проект. По итогу дам развернутый фидбек.
Пишите, спрашивайте, за спрос денег не берут)
@Oleborn
Карьерным консультантом не работаю, но до уровня крепкого мидла с Spring доведу.
Что изучаем: Spring Boot, Spring Security, Spring Data, OAuth2, FeignClient, Specification, Pageable, WebClient, PostgreSQL, Redis, Hibernate, REST API, Caffeine, JUnit, Mockito, WireMock, Zonky, Kafka, Apache Common и так далее. Но тут не все))
Кроме того могу провести мок-интервью или проверить ваш пет-проект. По итогу дам развернутый фидбек.
Пишите, спрашивайте, за спрос денег не берут)
@Oleborn
👍6
Ребят кому не сложно, накиньте пару лайков под статьей - https://habr.com/ru/articles/1065138/
Если вам конечно понравилось))) А то как то сиротливо смотрится))))))))))
Если вам конечно понравилось))) А то как то сиротливо смотрится))))))))))
Хабр
"__TypeId__": как один Kafka-заголовок незаметно связывает микросервисы именами Java-классов
Всем привет! Пока ищу работу, продолжаю знакомить Вас с внутренностями и неочевидными моментами работы распределенной микросервисной архитектуры в мире Java Spring. Сегодня на очереди Apache Kafka,...
🔥3 1
Java for Beginner
Ребят кому не сложно, накиньте пару лайков под статьей - https://habr.com/ru/articles/1065138/ Если вам конечно понравилось))) А то как то сиротливо смотрится))))))))))
Честно говоря я не пойму почему статья не зашла... Реально больная тема. Реально не все знают пути решения... Хм......
История технологии сегодня — 03 августа
ℹ️ Кто родился в этот день
Коити Танака, иногда Коичи Танака (яп. 田中 耕一 Танака Ко:ити, род. 3 августа 1959, Тояма, Япония) — японский инженер и химик, лауреат Нобелевской премии по химии 2002 года за разработку нового масс-спектрометрического метода исследования биологических макромолекул. Он единственный Нобелевский лауреат без научной степени.
🌐 Знаковые события
1929 — в Ростове-на-Дону стала работать первая в СССР автоматическая телефонная станция (АТС) на 6000 номеров, построенная при содействии шведской фирмы «Эрикссон».
2004 — запущена автоматическая межпланетная станция (АМС) MESSENGER для исследования Меркурия.
#Biography #Birth_Date #Events #03августа
Коити Танака, иногда Коичи Танака (яп. 田中 耕一 Танака Ко:ити, род. 3 августа 1959, Тояма, Япония) — японский инженер и химик, лауреат Нобелевской премии по химии 2002 года за разработку нового масс-спектрометрического метода исследования биологических макромолекул. Он единственный Нобелевский лауреат без научной степени.
1929 — в Ростове-на-Дону стала работать первая в СССР автоматическая телефонная станция (АТС) на 6000 номеров, построенная при содействии шведской фирмы «Эрикссон».
2004 — запущена автоматическая межпланетная станция (АМС) MESSENGER для исследования Меркурия.
#Biography #Birth_Date #Events #03августа
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
[Совет по Java #067]
Тема:
Проблема: Многие разработчики ошибочно полагают, что
На самом деле этот метод оборачивает переданный список в прокси-объект, который перехватывает все методы, изменяющие коллекцию (
Однако сам исходный список остается доступным через оригинальную ссылку, и любые его модификации немедленно отражаются в неизменяемом view. Это нарушает инкапсуляцию и может привести к неожиданному поведению: клиент, получивший неизменяемый список, ожидает, что его содержимое будет постоянным, но оно может измениться из-за внешних изменений. Особенно опасно в многопоточных сценариях, когда исходный список модифицируется конкурентно.
Этот паттерн часто называют "неизменяемая обертка" (unmodifiable wrapper), а не "иммутабельная коллекция" (immutable collection), в отличие от
Решение: Если вы хотите защитить данные от изменений, возвращая неизменяемый список, убедитесь, что исходный список больше не доступен для модификации в вашем коде.
Либо передавайте только view клиентам и храните исходный список только внутри класса, с возможностью его изменения только через внутренние методы. Для полной изоляции создавайте копию исходного списка перед оборачиванием:
Однако такая копия защищает только от изменений через оригинальную ссылку, но сама копия все еще изменяема, если сохранить ссылку на нее. Лучшее решение — использовать
Объяснение:
Это часто используется в API для предоставления доступа "только для чтения" к внутреннему состоянию. Однако для гарантии неизменности данных нужно либо сделать исходный список недоступным для модификации (например, через
#Java #советы
Тема:
Collections.unmodifiableList возвращает view на исходный список.Проблема: Многие разработчики ошибочно полагают, что
Collections.unmodifiableList(list) создает независимую неизменяемую копию исходного списка. На самом деле этот метод оборачивает переданный список в прокси-объект, который перехватывает все методы, изменяющие коллекцию (
add, remove, set и др.), и выбрасывает UnsupportedOperationException. Однако сам исходный список остается доступным через оригинальную ссылку, и любые его модификации немедленно отражаются в неизменяемом view. Это нарушает инкапсуляцию и может привести к неожиданному поведению: клиент, получивший неизменяемый список, ожидает, что его содержимое будет постоянным, но оно может измениться из-за внешних изменений. Особенно опасно в многопоточных сценариях, когда исходный список модифицируется конкурентно.
Этот паттерн часто называют "неизменяемая обертка" (unmodifiable wrapper), а не "иммутабельная коллекция" (immutable collection), в отличие от
List.of() или Collections.emptyList(), которые действительно неизменяемы.Решение: Если вы хотите защитить данные от изменений, возвращая неизменяемый список, убедитесь, что исходный список больше не доступен для модификации в вашем коде.
Либо передавайте только view клиентам и храните исходный список только внутри класса, с возможностью его изменения только через внутренние методы. Для полной изоляции создавайте копию исходного списка перед оборачиванием:
Collections.unmodifiableList(new ArrayList<>(list)). Однако такая копия защищает только от изменений через оригинальную ссылку, но сама копия все еще изменяема, если сохранить ссылку на нее. Лучшее решение — использовать
List.copyOf() (Java 10+) или List.of() (Java 9+), которые создают действительно неизменяемые списки, не зависящие от оригинала. Если вы используете unmodifiableList, явно документируйте, что view отражает изменения исходного списка, и что клиент не должен рассчитывать на неизменность содержимого без внешних гарантий.public class UnmodifiableView {
public static void main(String[] args) {
List<String> original = new ArrayList<>(Arrays.asList("A", "B", "C"));
List<String> unmodifiable = Collections.unmodifiableList(original);
System.out.println("Original: " + original); // [A, B, C]
System.out.println("Unmodifiable: " + unmodifiable); // [A, B, C]
// Изменяем исходный список
original.add("D");
System.out.println("После изменения оригинала:");
System.out.println("Original: " + original); // [A, B, C, D]
System.out.println("Unmodifiable: " + unmodifiable); // [A, B, C, D] — изменился!
// Попытка изменить view вызовет исключение
try {
unmodifiable.add("E"); // UnsupportedOperationException
} catch (UnsupportedOperationException e) {
System.err.println("Нельзя изменить view");
}
//Решение 1: копия + обертка (все равно оригинал может быть изменен, если доступен)
List<String> copyAndWrap = Collections.unmodifiableList(new ArrayList<>(original));
original.add("F");
System.out.println("Copy+wrap не изменился: " + copyAndWrap); // [A, B, C, D] — не изменился
//Решение 2: List.copyOf (Java 10+) — действительно неизменяемый
List<String> immutable = List.copyOf(original);
original.add("G");
System.out.println("List.copyOf: " + immutable); // [A, B, C, D, F] — не изменился
//Решение 3: List.of (Java 9+) — для фиксированного набора значений
List<String> fixed = List.of("X", "Y", "Z");
// fixed не зависит от внешних списков
}
}Объяснение:
Collections.unmodifiableList использует паттерн декоратор. Возвращаемый объект — внутренний класс UnmodifiableList, который делегирует все методы чтения (get, size, iterator) исходному списку, а все методы записи переопределяет, бросая исключение. Поскольку он хранит ссылку на исходный список, любые изменения в исходном списке видны через view. Это часто используется в API для предоставления доступа "только для чтения" к внутреннему состоянию. Однако для гарантии неизменности данных нужно либо сделать исходный список недоступным для модификации (например, через
private и отсутствие сеттеров), либо использовать действительно неизменяемые коллекции. List.copyOf() и List.of() возвращают экземпляры, которые не содержат ссылок на внешние изменяемые структуры, и их содержимое гарантированно не изменяется. #Java #советы
👍5
Что выведет код?
#Tasks
import java.util.*;
public class Task030826 {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3));
List<Integer> unmod = Collections.unmodifiableList(list);
list.add(4);
try {
unmod.add(5);
} catch (UnsupportedOperationException e) {
System.out.print("ex ");
}
System.out.println(unmod.size());
}
}
#Tasks
👍4
👍4
Что такое 🤓
Ответ:
Collectors.teeing() (Java 12) — это составной коллектор, который принимает два коллектора и функцию объединения их результатов.
Позволяет выполнить две независимые операции над одним стримом за один проход.
Пример: Collectors.teeing(Collectors.summingInt(Item::getPrice), Collectors.counting(), (sum, count) -> sum / count) — вычисляет среднюю цену за один проход.
Полезно, когда нужно несколько агрегаций, но стрим нельзя переиспользовать.
#собеседование
Collectors.teeing()? Collectors.teeing() (Java 12) — это составной коллектор, который принимает два коллектора и функцию объединения их результатов.
Позволяет выполнить две независимые операции над одним стримом за один проход.
Пример: Collectors.teeing(Collectors.summingInt(Item::getPrice), Collectors.counting(), (sum, count) -> sum / count) — вычисляет среднюю цену за один проход.
Полезно, когда нужно несколько агрегаций, но стрим нельзя переиспользовать.
#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
История технологии сегодня — 04 августа
ℹ️ Кто родился в этот день
Джорджо Паризи (итал. Giorgio Parisi; род. 4 августа 1948 года) — итальянский физик-теоретик. Труды в основном посвящены квантовой теории поля, статистической механике и сложным системам. Соавтор уравнения ДГЛАП, уравнений Кардара — Паризи — Жанга. Нобелевская премия по физике (2021) за «открытие того, как беспорядок и флуктуации взаимодействуют в физических системах в масштабах от атомов до планет».
🌐 Знаковые события
1954 — свой первый полёт совершил британский сверхзвуковой самолёт P-1.
2007 — запущен космический аппарат НАСА «Феникс», предназначенный для исследования Марса.
#Biography #Birth_Date #Events #04августа
Джорджо Паризи (итал. Giorgio Parisi; род. 4 августа 1948 года) — итальянский физик-теоретик. Труды в основном посвящены квантовой теории поля, статистической механике и сложным системам. Соавтор уравнения ДГЛАП, уравнений Кардара — Паризи — Жанга. Нобелевская премия по физике (2021) за «открытие того, как беспорядок и флуктуации взаимодействуют в физических системах в масштабах от атомов до планет».
1954 — свой первый полёт совершил британский сверхзвуковой самолёт P-1.
2007 — запущен космический аппарат НАСА «Феникс», предназначенный для исследования Марса.
#Biography #Birth_Date #Events #04августа
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Раздел 11. Работа с файлами, I/O и сетью (NIO.2)
Глава 3. Сериализация и форматы обмена
JSON — современный стандарт обмена данными
JSON (JavaScript Object Notation) — это текстовый формат сериализации данных, изначально выведенный из синтаксиса литералов объектов языка JavaScript. Несмотря на происхождение, JSON является полностью языконезависимым форматом и определён стандартом RFC 8259 (декабрь 2017), который заменил RFC 7159. Сегодня JSON де-факто является стандартным форматом обмена данными в веб-сервисах, конфигурационных файлах, логах, сообщениях брокеров и хранилищах документов.
Что такое JSON
JSON представляет собой текстовый формат, основанный на двух структурах:
Коллекция пар ключ-значение — в разных языках это реализуется как объект, запись, структура, словарь, хэш-таблица или ассоциативный массив.
Упорядоченный список значений — в большинстве языков это массив, вектор, список или последовательность.
Формат спроектирован так, чтобы быть легко читаемым для человека и легко парсящимся для машины. Это достигается за счёт минималистичного синтаксиса и строгих правил: каждый документ JSON — это либо один объект, либо один массив.
JSON как основа REST API
JSON стал доминирующим форматом представления ресурсов в REST API благодаря нескольким факторам:
Нативная поддержка в JavaScript, который исполняется в браузере клиента.
Простота генерации и парсинга на стороне сервера — любой язык имеет библиотеку для работы с JSON.
Читаемость при отладке — в отличие от бинарных форматов, JSON можно просмотреть в инструментах разработчика браузера или в логах.
Отсутствие необходимости в схеме для базового использования — в отличие от XML, JSON не требует DTD или XSD для валидации.
#Java #для_новичков #beginner #IO #NIO #Serialize #JSON
Глава 3. Сериализация и форматы обмена
JSON — современный стандарт обмена данными
JSON (JavaScript Object Notation) — это текстовый формат сериализации данных, изначально выведенный из синтаксиса литералов объектов языка JavaScript. Несмотря на происхождение, JSON является полностью языконезависимым форматом и определён стандартом RFC 8259 (декабрь 2017), который заменил RFC 7159. Сегодня JSON де-факто является стандартным форматом обмена данными в веб-сервисах, конфигурационных файлах, логах, сообщениях брокеров и хранилищах документов.
Сериализация — это процесс преобразования структуры данных или объекта в формат, который можно сохранить на диск, передать по сети или записать в базу данных, с возможностью последующего восстановления (десериализации) в исходную структуру.
RFC (Request for Comments) — серия документов Интернет-инженерного совета (IETF), описывающих стандарты, протоколы и технологии Интернета. RFC 8259 является официальной спецификацией формата JSON.
Что такое JSON
JSON представляет собой текстовый формат, основанный на двух структурах:
Коллекция пар ключ-значение — в разных языках это реализуется как объект, запись, структура, словарь, хэш-таблица или ассоциативный массив.
Упорядоченный список значений — в большинстве языков это массив, вектор, список или последовательность.
Формат спроектирован так, чтобы быть легко читаемым для человека и легко парсящимся для машины. Это достигается за счёт минималистичного синтаксиса и строгих правил: каждый документ JSON — это либо один объект, либо один массив.
Парсинг — это процесс анализа строки или потока данных в соответствии с правилами формального языка (грамматикой) с целью построения структурированного представления, обычно дерева разбора или абстрактного синтаксического дерева (AST).
JSON как основа REST API
REST (Representational State Transfer) — это архитектурный стиль проектирования распределённых систем, введённый Роем Филдингом в его докторской диссертации 2000 года. REST не является протоколом или стандартом в строгом смысле; это набор ограничений и принципов.
Ключевое ограничение — statelessness (отсутствие состояния): каждый запрос от клиента к серверу должен содержать всю информацию, необходимую для его обработки, и сервер не хранит контекст клиента между запросами.
JSON стал доминирующим форматом представления ресурсов в REST API благодаря нескольким факторам:
Нативная поддержка в JavaScript, который исполняется в браузере клиента.
Простота генерации и парсинга на стороне сервера — любой язык имеет библиотеку для работы с JSON.
Читаемость при отладке — в отличие от бинарных форматов, JSON можно просмотреть в инструментах разработчика браузера или в логах.
Отсутствие необходимости в схеме для базового использования — в отличие от XML, JSON не требует DTD или XSD для валидации.
DTD (Document Type Definition) и XSD (XML Schema Definition) — это механизмы определения структуры и допустимых элементов XML-документа. JSON изначально не имел встроенного механизма схем, хотя позже появились JSON Schema и OpenAPI.
#Java #для_новичков #beginner #IO #NIO #Serialize #JSON
👍3