Какие различия между ObjectInput / OutputStream и DataInput / OutputStream при применении к экземплярам примитивных типов? - PullRequest
1 голос
/ 19 мая 2019

Мне кажется, что и ObjectInputStream / ObjectOutputStream, и DataInputStream / DataOutputStream могут применяться к экземплярам примитивных типов. Какие различия между ObjectInputStream / ObjectOutputStream и DataInputStream / DataOutputStream, когда они оба применяются к экземплярам примитивных типов?

Могут ли они (де) сериализовать экземпляры примитивных типов одинаковым образом?

Ответы [ 2 ]

2 голосов
/ 19 мая 2019

Это то, что вы можете легко узнать сами с помощью быстрого теста:

import java.io.*;

public class Test {
    public static void main(String[] args) {
        try {
            ObjectOutputStream out1 = new ObjectOutputStream(new FileOutputStream("1.out"));
            out1.writeByte(100);
            out1.close();

            DataOutputStream out2 = new DataOutputStream(new FileOutputStream("2.out"));
            out2.writeByte(100);
            out2.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

Когда вы запустите этот код, вы сразу увидите разницу: Файл ObjectOutputStream больше. ObjectOutputStream записывает всего 7 байтов вместо одного байта, который записывает DataOutputStream.

ObjectOutputStream - это не просто запись основных данных. Он использует протокол потока сериализации объектов Java, который можно найти по адресу https://docs.oracle.com/javase/7/docs/platform/serialization/spec/protocol.html#10258

1 голос
/ 19 мая 2019

Примечание: Не использовать сериализацию Java.Также DataOutputStream имеет некоторое дурацкое форматирование, так что не используйте это тоже.

DataOutputStream предоставляет слой поверх OutputStream, который поддерживает форматирование данных в соответствии с требованиями к файлам классов Java.Он не добавляет никаких тегов / метаданных, он просто записывает данные в стандартном формате.Это явно часть раннего компилятора, обнародованного, потому что это может быть полезно - типично для классов JDK1.00.

ObjectOutputStream предоставляет слой над DataOutputStream (не должен быть реализован с этим классом,но формат данных низкого уровня такой же), который поддерживает запись определенного формата файла, содержащего произвольные данные объекта.Как и в большинстве форматов, это включает в себя пакет заголовков.

Когда вы пишете объект в ObjectOutputStream, он также напишет описание класса или ссылку, если он использовался с момента последнего reset.Методы «data» задаются для форматирования, аналогичного DataOutputStream, , но файл уже имеет заголовок .Эти методы обычно используются в пользовательских writeObject методах после defaultWriteObject или writeFields.

tl; dr Там есть заголовок с ObjectOutputStream;ObjectOutputStream - это (проницаемый) слой поверх DataOutputStream.

...