В последнее время я пытаюсь узнать больше и вообще тестировать сериализацию 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?