【问题标题】:C# write class object to binary file in one stepC#一步将类对象写入二进制文件
【发布时间】:2017-05-04 01:58:15
【问题描述】:

好的,在 C++ 中,我可以创建一个包含一堆值类型的 struct 对象,并在需要时在单个写入语句中将其写入二进制文件,如下所示:

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 并尝试序列化对象,但这会向流中添加一堆文本和其他内容。我只想写出对象中的所有值字段。这是可能的还是我必须分别写出对象上的每个字段?

【问题讨论】:

  • 编写自己的二进制 BinaryFormatter 并不难。
  • 为什么不使用现有的 BinaryFormatter
  • @ilansch,因为它在流中填充了大量“文本”。诸如 DLL 名称、版本、文化、字段名称之类的内容。它返回 169 而不是 12 个字节。

标签: c# c++ binaryfiles binary-data


【解决方案1】:
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();

【讨论】:

  • 这不起作用,因为如前所述,BinaryFormatter 在流中填充了一堆关于 DLL 名称、版本、文化......等的垃圾。我只想要字段的二进制数据,什么都没有别的。如果 ms.ToArray() 返回 12 个字节,那就太好了,但它没有返回 169。
  • 那么可能在物业上单独做是你最好的选择
  • 它这样做的原因也是因为它在反序列化时必须知道类型
  • 我理解为什么“序列化”会添加所有信息,但是当您需要精确格式的数据时这不起作用。出于好奇,您为什么要继续添加 .Dump()?这不是我在任何地方都能看到的方法吗?
  • 我将 Linqpad 用于我的测试代码,它有一个很好的 Dump() 方法可以很好地打印对象的内容。
猜你喜欢
  • 2012-07-08
  • 1970-01-01
  • 2015-07-09
  • 2015-07-03
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 2017-01-26
  • 1970-01-01
相关资源
最近更新 更多