c#中的动态结构成员是否可能依赖于另一个成员?
本文关键字:成员 依赖于 另一个 是否 动态 结构 | 更新日期: 2023-09-27 18:06:31
在本例中,二进制文件使用基于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#中是否可以实现
当然-在某种程度上您必须自己实现序列化,但是您可以很容易地做到这一点。
不清楚你使用的是什么类型的序列化-如果你使用来自。net的"原始"二进制序列化,你想覆盖GetObjectData
,只添加序列化上的相关数据,然后在受保护的构造函数中使用SerializationInfo
和StreamingContext
,从相同的数据反向填充你的结构。有关详细信息,请参阅这篇MSDN文章。
我不知道如果你使用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);
}
顺便说一下,我要认真考虑结构体是否真的是最好的方法——考虑使用类来代替。我很少创建自己的结构体。
注意:您的示例只显示了嵌套结构类型的声明,而不是它的实例。
从你的问题措辞来看,你需要一个实例成员。
struct fileformat
{
struct mask // type declaration only
{
bool mem1present
bool mem2present
bool mem3present
//5 bits unused
}
public mask mask; // <-- Member instance here
}
如果我误解了,我道歉。也许你的结构体只是为了向我们传达文件的结构?