2017-05-04 23 views
0

Ok、C++では、値の束を含むstructオブジェクトを作成し、必要に応じて以下のような単一のwrite文でバイナリファイルに書き出します。C#クラスオブジェクトをバイナリファイルに一度に書き込む

struct DataFileHeader { 
    unsigned short Id; 
    unsigned short Type; 
    unsigned int Count; 
    unsigned int Offset; 
}; 

... 

struct DataFileHeader dataFileHeader; 

... 
rc = _write(fileHandle, &dataFileHeader, 12); 

C#でこれを行う方法はありますか?構造体をC#でクラスに変換し、BinaryFormatterで作業していて、オブジェクトをシリアル化しようとしていますが、ストリームにテキストやその他のものを追加しています。オブジェクトのすべての値フィールドを書きたいだけです。これは可能ですか、オブジェクトの各フィールドを個別に書き込む必要がありますか?

+0

独自のバイナリ形式のBinaryFormatterを記述するのは難しくありません。 –

+0

既存のBinaryFormatter – ilansch

+0

@ilanschを使用しない理由は、ストリームに大量の「テキスト」が含まれているためです。 DLLの名前、バージョン、文化、フィールド名のようなもの。ちょうど12バイトの代わりにそれは169を返します。 – dblwizard

答えて

0
void Main() 
{ 
    var fileHeader = new DataFileHeader() 
    { 
     Count = 10, 
     Id = 10, 
     Offset = 10, 
     Type = 10 
    }; 

    Serialize(fileHeader).Dump(); 
} 

// Define other methods and classes here 
public byte[] Serialize<TObject>(TObject obj) 
{ 
    BinaryFormatter binaryFormatter = new BinaryFormatter(); 
    byte[] ret = null; 
    using (MemoryStream ms = new MemoryStream()) 
    { 
     binaryFormatter.Serialize(ms, obj); 
     ret = ms.ToArray(); 
    } 
    return ret; 
} 

[Serializable] 
public struct DataFileHeader 
{ 
    public short Id; 
    public short Type; 
    public int Count; 
    public int Offset; 
}; 

これが機能しない場合は、個別に行うことが唯一の方法かもしれないと思います。

BitConverter.GetBytes(fileHeader.Count).Concat(BitConverter.GetBytes(fileHeader.Count)).Concat(BitConverter.GetBytes(fileHeader.Count)).Concat(BitConverter.GetBytes(fileHeader.Count)).Dump(); 
+0

これは動作しません。前述のように、BinaryFormatterはストリーム内でDLLの名前、バージョン、カルチャなどに関する情報を詰め込んでいるからです。フィールドのバイナリデータ、他に何もない。 ms.ToArray()は12バイトを返すが、それは大丈夫だが169を返さない。 – dblwizard

+0

次に、おそらくそれをプロパティで個別に行うのは、ur best betである。 – loneshark99

+0

また、デシリアライズ時にタイプします – loneshark99

関連する問題