C# 在c中是否可以使动态结构成员依赖于另一个成员

C# 在c中是否可以使动态结构成员依赖于另一个成员,c#,dynamic,struct,member,C#,Dynamic,Struct,Member,在这种情况下,将使用基于结构的文件格式写入二进制文件 struct fileformat { struct mask { bool mem1present bool mem2present bool mem3present //5 bits unused } //member o

在这种情况下,将使用基于结构的文件格式写入二进制文件

    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的受保护构造函数中,从相同的数据反向填充结构。有关详细信息,请参阅

我不知道如果使用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
} 

如果我误解了,我道歉。也许您的结构只是为了将文件的结构传达给我们?

您使用什么将结构写入文件?我已经尝试过写入所有内容,但如果它没有动态更改,则无法正确整理数据。所以问题仍然存在,这是可能的还是我只是在浪费时间。我没有自己写文件,我只是取出数据。我实际上没有使用任何序列化,我只是从数据中读取一个字节,告诉它的数据长度,然后使用Marshall.ptr构造一个字节数组,以数据长度开头。“我在用c实现上面的sudo代码时遇到了麻烦,因为它是动态的。”@michael:你将无法使用Marshal.PtrToStructure。。。您应该显式地编写代码,以便从流中读取/写入字节。目前还不清楚您遇到的问题是IO还是结构的基本布局。顺便说一句,有什么理由它是一个结构而不是一个类吗?是的,我认为Marshal.PtrToStructure不能用在我的例子中,因为动态性。IO没有问题,只是我正在计算结构的基本布局是否可行。真的没有理由。我只是想知道他们最初是怎么做到的。我猜他们也明确地实现了它。@michael:在这种情况下,他们是谁?您需要分离文件布局和内存布局的概念。。。我会编辑的。是的,我想这是我没有完全理解的。内存布局将尽可能完整。而在文件布局过程中,他们会做一些激进的事情来节省所需的空间。谢谢你,乔恩。