Почему я должен использовать сериализацию вместо файлового ввода-вывода в Java - PullRequest
1 голос
/ 22 марта 2012

В механизме сериализации мы записываем объект в поток, используя objectinputstream и object outputtream. Эти объекты передаются по сети. В этом механизме используется поток ввода / вывода объекта. Так что я могу использовать File INPUT / OUTPUT Streams вместо вызова сериализации маркерный интерфейс?.

Ответы [ 7 ]

2 голосов
/ 22 марта 2012

Полагаю, вы смешиваете сериализацию и общий ввод / вывод.

Сериализация - это способ преобразования объектов в последовательности байтов (и обратно, что называется десериализацией). Таким образом, вы можете передавать сериализуемые объекты по сети и сохранять их в файлах.

Потоки ввода / вывода файлов предназначены для хранения / чтения любого вида данных в / из файлов.

1 голос
/ 29 октября 2014

Сначала давайте сконцентрируемся на определении: Сериализация: это процесс преобразования состояния объекта в формат, который может быть сохранен и позже восстановлен таким же образом.

Тогда как в файлеВвод / вывод Невозможно сохранить структуру данных или объект, а затем восстановить их таким же образом. Именно поэтому мы используем методы сериализации или запросов к базе данных (например, sql, mongodb).

JSON / XML также можно использовать для сериализации с использованием его синтаксического анализатора.

Возьмите пример javascript (не java, но используйте его как независимую от языка):

var obj = { // it's an object in javascript (same like json) a: "something", b: 3, c: "another" };

Теперь, если вы попытаетесь использовать файловый ввод-вывод для сохранения в файле (скажем, abc.txt), он будет сохранен как строка, что означает, что к нему нельзя получить доступ позже в другом коде, прочитав этофайл (abc.txt), например:

// readThisFile();

// obj.a;

Но если вы используете сериализацию (в javascript с использованием JSON изначально), вы можете прочитать егоиз файла

1 голос
/ 22 марта 2012

Файловый ввод-вывод и сериализация - это две разные вещи. Файловый ввод / вывод используется для чтения / записи файла. Интерфейс сериализации используется для двоичной интерпретации объекта. Поэтому НЕТ, вы не можете использовать файловые потоки для отправки по сети (возможно, существует какой-то обходной путь для отправки данных по сети с использованием файловых потоков, но это все равно, что пытаться летать на машине)

1 голос
/ 22 марта 2012

когда вам нужно перенести ваш объект в сеть, вам нужно его сериализовать. Ниже ссылка может быть полезна для вас.

http://java.sun.com/developer/technicalArticles/Programming/serialization/

0 голосов
/ 24 марта 2012

В механизме сериализации мы записываем объект в поток s, используя ObjectInputStream и ObjectOutputStream.

Ok

Эти объекты передаются по сети. В этом механизме используется ObjectInput / Выходной поток.

Я следую за тобой.

Так что я могу использовать потоки файлов ввода / вывода вместо вызова интерфейс маркера сериализации?.

Здесь ты потерял меня. Вы хотите отправить объект по сети или просто сериализовать его?

Конечно, вы можете использовать любые потоки ввода / вывода вместе с потоками ObjectInput / ObjectOutput для сериализации объектов на разные носители.

Например:

ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("jedis.bin"));
out.writeObject(new Jedi("Luke"));

Сериализует объект в файл с именем jedis.bin

и код

ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
ObjectOputStream out = new ObjectOutputStream(byteStream);
out.writeObject(new Jedi("Luke"));

Сериализует объект в массив памяти.

Итак, все, что является потоком вывода / ввода, должно использоваться в качестве основного потока, используемого потоками ObjectInput / ObjectOutput.

0 голосов
/ 22 марта 2012

Сериализация / десериализация используется для чтения и записи объектов, которые не только создают сжатые данные, которые не читаются, но также записывают их в двоичном виде.Файловый ввод / вывод используется для чтения и записи.Похоже, что вы не хотите сериализовать, если вы этого не сделаете, не используйте его.Читай и пиши свои файлы в тексте.

0 голосов
/ 22 марта 2012

Поскольку потоки являются аддитивными, вы можете сделать что-то вроде

FileOutputStream fos = new FileOutputStream("/some/file/to/write/to");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(someObject);

Не уверен, что это то, о чем вы спрашивали, но трудно сказать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...