是否有可能将动态struct成员依赖于c#中的另一个成员

时间:2011-08-25 03:06:08

标签: c# dynamic struct member

在这种情况下,二进制文件使用基于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#

中实现

2 个答案:

答案 0 :(得分:0)

当然 - 你必须在某种程度上自己实现序列化,但是你可以很容易地做到这一点。

目前还不清楚你正在使用什么类型的序列化 - 如果你使用.NET的“原始”二进制序列化,你想覆盖GetObjectData只在序列化中添加相关数据,然后在受保护的构造函数采用SerializationInfoStreamingContext,从相反的数据中反向填充结构。有关详细信息,请参阅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
} 
如果我误解了,我道歉。也许你的结构只是为了向我们传达文件的结构?