В последнее время я пытался узнать больше и вообще тестировать сериализацию Java как для рабочих, так и для личных проектов, и я должен сказать, что чем больше я знаю об этом, тем меньше мне это нравится. Это может быть вызвано дезинформацией, поэтому я спрашиваю у вас две вещи:
1: На уровне байтов, как сериализация знает, как сопоставить сериализованные значения с некоторым классом?
Одна из моих проблем заключается в том, что я провел небольшой тест с ArrayList, содержащий значения «один», «два», «три». После сериализации байтовый массив занял 78 байтов, что кажется очень большим для такого небольшого количества информации (19 + 3 + 3 + 4 байта). Конечно, есть некоторые накладные расходы, но это приводит ко второму вопросу:
2: Можно ли считать сериализацию хорошим методом для сохранения объектов вообще? Теперь, очевидно, если бы я использовал какой-нибудь самодельный формат XML, данные о сохранении были бы примерно такими:
<object>
<class="java.util.ArrayList">
<!-- Object array inside Arraylist is called elementData -->
<field name="elementData">
<value>One</value>
<value>Two</value>
<value>Three</value>
</field>
</object>
, который, как и XML в целом, немного раздут и занимает 138 байт (то есть без пробелов). То же самое в JSON может быть
{
"java.util.ArrayList": {
"elementData": [
"one",
"two",
"three"
]
}
}
, что на 75 байт уже немного меньше, чем в сериализации Java. С этими текстовыми форматами, конечно же, очевидно, что должен быть способ представить ваши основные данные в виде текста, чисел или любой их комбинации.
Итак, резюмируем, как сериализация работает на уровне байтов / бит, когда она должна использоваться и когда ее не следует использовать, и каковы реальные преимущества сериализации, кроме того, что она является стандартной в Java?