在这种情况下,二进制文件使用基于struct
的文件格式编写 struct fileformat
{
struct mask
{
bool mem1present
bool mem2present
bool mem3present
//5 bits unused
}
//member only written in file if mem1present is true
byte mem1present
//member only written in file if mem2present is true
byte mem1present
//member only written in file if mem3present is true
byte mem1present
}
这可以在c#
中实现答案 0 :(得分:0)
当然 - 你必须在某种程度上自己实现序列化,但是你可以很容易地做到这一点。
目前还不清楚你正在使用什么类型的序列化 - 如果你使用.NET的“原始”二进制序列化,你想覆盖GetObjectData
只在序列化中添加相关数据,然后在受保护的构造函数采用SerializationInfo
和StreamingContext
,从相反的数据中反向填充结构。有关详细信息,请参阅this MSDN article。
如果您正在使用XML序列化,我不知道会发生什么。
如果您正在编写自己的序列化(即您有WriteToStream
等方法),那么您可以根据需要选择代表它。
编辑:听起来你可能已经有了需要阅读的现有文件格式,但是你可以定义自己的类型。有一个具有多个成员的类或结构很容易,并且可能一个掩码来说明什么是设置,虽然不知道更多它可能不是最好的设计。虽然可以使用显式布局来提高内存的效率,但最简单的方法就是拥有单独的成员:
struct Foo
{
// Bit-set to determine which fields are actually used
private readonly byte mask;
private readonly int value1;
private readonly int value2;
private readonly int value3;
public Foo(byte mask, int value1, int value2, int value3)
{
this.mask = mask;
this.value1 = value1;
this.value2 = value2;
this.value3 = value3;
}
}
然后在某处(无论是否在数据类型中),如:
Foo ReadFoo(Stream stream)
{
byte mask = stream.ReadByte();
int value1 = 0, value2 = 0, value3 = 0;
if ((mask & 1) == 1)
{
// However you do that, depending on your file format
value1 = ReadInt32FromStream(stream);
}
if ((mask & 2) == 2)
{
// However you do that, depending on your file format
value2 = ReadInt32FromStream(stream);
}
if ((mask & 4) == 4)
{
// However you do that, depending on your file format
value3 = ReadInt32FromStream(stream);
}
return new Foo(mask, value1, value2, value3);
}
顺便说一句,我会认真考虑一个结构是否真的这里是最好的方法 - 考虑使用类来代替。我很少创建自己的结构。
答案 1 :(得分:0)
注意:您的示例仅显示嵌套结构类型的声明,而不是它的实例。
根据您的问题措辞,您需要一个实例成员。
struct fileformat
{
struct mask // type declaration only
{
bool mem1present
bool mem2present
bool mem3present
//5 bits unused
}
public mask mask; // <-- Member instance here
}
如果我误解了,我道歉。也许你的结构只是为了向我们传达文件的结构?