public override void ReadFromPhysical(byte[] buffer, int offset) { // Clear current value if (ValuesOwned && !IsNative && (StreamID != StreamID.Null)) { Manager.StreamManager.Deallocate(StreamID); } // Read scalar header byte header = buffer[offset]; offset++; if ((header & 1) != 0) // if not nil { if ((header & 2) != 0) { if (DataType.IsCompound) { using (IRow row = (IRow)DataValue.FromPhysical(Manager, DataType.CompoundRowType, buffer, offset)) { Value = row.AsNative; row.ValuesOwned = false; } } else { Streams.IConveyor conveyor = Manager.GetConveyor(DataType); if (conveyor.IsStreaming) { Stream stream = new MemoryStream(buffer, offset, buffer.Length - offset, false, true); Value = conveyor.Read(stream); stream.Close(); } else { Value = conveyor.Read(buffer, offset); } } } else { if ((header & 4) != 0) // if expanded form { Value = Manager.StreamManager.Allocate(); Stream stream = Manager.StreamManager.Open(StreamID, LockMode.Exclusive); stream.Write(buffer, offset, buffer.Length - offset); stream.Close(); } else { Value = StreamID.Read(buffer, offset); } } } else { if ((header & 2) != 0) { Value = null; } else { Value = StreamID.Null; } } }