func (f binaryRecordFormatV0) Deserialize(doc *orient.Document, r *rw.ReadSeeker) error { className := f.readString(r) if err := r.Err(); err != nil { return err } if len(className) != 0 { doc.FillClassNameIfNeeded(className) } var ( fieldName string valuePos int valueType orient.OType last int64 ) for { //var prop core.OGlobalProperty leng := int(r.ReadVarint()) if err := r.Err(); err != nil { return err } if leng == 0 { // SCAN COMPLETED break } else if leng > 0 { // PARSE FIELD NAME fieldNameBytes := make([]byte, leng) r.ReadRawBytes(fieldNameBytes) fieldName = string(fieldNameBytes) valuePos = int(f.readInteger(r)) valueType = f.readOType(r) } else { // LOAD GLOBAL PROPERTY BY ID prop := f.getGlobalProperty(doc, leng) fieldName = prop.Name valuePos = int(f.readInteger(r)) if prop.Type != orient.ANY { valueType = prop.Type } else { valueType = f.readOType(r) } } if doc.RawContainsField(fieldName) { continue } if valuePos != 0 { headerCursor, _ := r.Seek(0, 1) r.Seek(int64(valuePos), 0) value, err := f.readSingleValue(r, valueType, doc) if err != nil { return err } if cur, _ := r.Seek(0, 1); cur > last { last = cur } r.Seek(headerCursor, 0) doc.RawSetField(fieldName, value, valueType) } else { doc.RawSetField(fieldName, nil, orient.UNKNOWN) } } //doc.ClearSource() if cur, _ := r.Seek(0, 1); last > cur { r.Seek(last, 0) } return r.Err() }