2017-05-04 162 views
0

好吧,在C++中,我可以創建一個結構對象,其中包含一堆值類型,並在需要時將它寫入到單個寫入語句中的二進制文件中,如下所示: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

@ilansch爲什麼不使用現有的BinaryFormatter – ilansch

+0

,因爲它在流中填充了大量的「文本」。諸如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

然後可能單獨在屬性上做它最好的選擇 – loneshark99

+0

也是這樣做的原因是因爲它必須知道在反序列化時鍵入 – loneshark99