/// <summary> /// Seeks the field by name. /// </summary> private bool SeekField(string fieldName) { if (_curRaw) { throw new BinaryObjectException("Cannot read named fields after raw data is read."); } if (!_curHdr.HasSchema) { return(false); } var actionId = _curStruct.CurStructAction; var fieldId = _curStruct.GetFieldId(fieldName); if (_curSchema == null || actionId >= _curSchema.Length || fieldId != _curSchema[actionId]) { _curSchemaMap = _curSchemaMap ?? BinaryObjectSchemaSerializer.ReadSchema(Stream, _curPos, _curHdr, () => _curSchema).ToDictionary(); _curSchema = null; // read order is different, ignore schema for future reads int pos; if (!_curSchemaMap.TryGetValue(fieldId, out pos)) { return(false); } Stream.Seek(pos + _curPos, SeekOrigin.Begin); } return(true); }
/// <summary> /// Write field ID. /// </summary> /// <param name="fieldName">Field name.</param> /// <param name="fieldTypeId">Field type ID.</param> private void WriteFieldId(string fieldName, byte fieldTypeId) { if (_curRawPos != 0) { throw new BinaryObjectException("Cannot write named fields after raw data is written."); } var fieldId = _curStruct.GetFieldId(fieldName, fieldTypeId); _schema.PushField(fieldId, _stream.Position - _curPos); }