Конечно - вам нужно до некоторой степени реализовать сериализацию самостоятельно, но вы можете сделать это достаточно легко.
Непонятно, какую сериализацию вы используете - если вы используете «сырую» двоичную сериализацию из .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);
}
Кстати, я бы серьезно подумал, является ли структура действительно лучшим подходом здесь - подумайте об использовании класса вместо этого. Я очень редко создаю свои собственные структуры.