0

多くのプログラミング言語で読み取り可能なデータを格納するために、バイナリ ファイルをよく使用します。VB.Net にもあります。VB6 でバイナリ ファイルを作成すると、バイナリ データのみが含まれますが、VB.NET で作成すると、次の例のようになります。

    Dim fs As New FileStream(setup_file, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite)
    Dim bf As New BinaryFormatter()
    bf.Serialize(fs, myStruct)
    fs.Close()

...データの前に、システムはデータの説明を含むヘッダーを作成します。そのため、さまざまなプログラミング言語やさまざまな OS でそのようなファイルを読み取る際に、主にヘッダーの長さを見つける際に問題が発生する可能性があります。

「昔ながらの」方法で同じファイルを作成できます。これらのファイルには「ヘッダー」は含まれず、純粋なデータだけですが、VB.NET プログラマーは新しいスタイルを強く推奨するとよく言います。
これは「昔ながらの」VB6 のような方法です。

    Dim fnum = FreeFile()
    FileOpen(fnum, setup_file, OpenMode.Binary, OpenAccess.ReadWrite, OpenShare.Shared, Len(myStruct))
    FilePut(fnum, myStruct, 1)
    FileClose(fnum)

質問は:

FileStream、BinaryFormatter、および Serialization を使用してバイナリ ファイルを作成/書き込みできますが、データを含むファイル内のヘッダーの作成とその方法は回避できますか?

4

2 に答える 2

2

.NET デシリアライザーは、逆シリアル化するオブジェクトのインスタンス化を担当するため、読み取るデータの型を知る必要があり、それがシリアライザーがそこに置く理由です。それが望ましくない場合は、独自のコードを作成する必要があります。

VB.NET プログラマーが推奨するのは、優れた入力であるとよく言いますが、それはリーダーとライターの両方を制御する場合に限られます。書き込むデータを読み取るリーダーに制約がある場合 (Mac で実行される Objective C コードなど)、そのファイルに何を入れるかを決定します。

とを見てSystem.IO.BinaryWriterくださいSystem.IO.BinaryReader。それらを使用すると、そこに置くことにしたもの以外の「ヘッダー」なしでバイナリファイルを書き込むことができます。バイト オーダーなどの問題が発生する可能性はまだありますが、バイナリ シリアライゼーションでは問題が解決されませんでした。

于 2012-12-07T21:38:59.930 に答える
1

オブジェクトをシリアル化するということは、生データ以外にいくつかの追加情報を追加して、後で同じオブジェクトクラスに逆シリアル化できるようにすることを意味します。他のプラットフォームでデータを読み取ることを計画している場合、それはあなたが望むものではありません。

BinaryWriterはそこに到達しますが、FilePutのような1つの便利な呼び出しではありません。

于 2012-12-07T21:46:16.417 に答える