protected bool Equals(SchemaPair other) { return(Equals(_writerSchema, other._writerSchema) && Equals(_readerSchema, other._readerSchema)); }
private ReadItem ResolveRecord(RecordSchema writerSchema, RecordSchema readerSchema) { var schemaPair = new SchemaPair(writerSchema, readerSchema); ReadItem recordReader; if (_recordReaders.TryGetValue(schemaPair, out recordReader)) { return(recordReader); } FieldReader[] fieldReaderArray = null; var recordAccess = GetRecordAccess(readerSchema); recordReader = (r, d) => ReadRecord(r, d, recordAccess, fieldReaderArray); _recordReaders.Add(schemaPair, recordReader); var readSteps = new List <FieldReader>(); foreach (Field wf in writerSchema) { Field rf; if (readerSchema.TryGetFieldAlias(wf.Name, out rf)) { var readItem = ResolveReader(wf.Schema, rf.Schema); if (IsReusable(rf.Schema.Tag)) { readSteps.Add((rec, d) => recordAccess.AddField(rec, rf.Name, rf.Pos, readItem(recordAccess.GetField(rec, rf.Name, rf.Pos), d))); } else { readSteps.Add((rec, d) => recordAccess.AddField(rec, rf.Name, rf.Pos, readItem(null, d))); } } else { var skip = GetSkip(wf.Schema); readSteps.Add((rec, d) => skip(d)); } } // fill in defaults for any reader fields not in the writer schema foreach (Field rf in readerSchema) { if (writerSchema.Contains(rf.Name)) { continue; } var defaultStream = new MemoryStream(); var defaultEncoder = new BinaryEncoder(defaultStream); defaultStream.Position = 0; // reset for writing Resolver.EncodeDefaultValue(defaultEncoder, rf.Schema, rf.DefaultValue); defaultStream.Flush(); var defaultBytes = defaultStream.ToArray(); var readItem = ResolveReader(rf.Schema, rf.Schema); var rfInstance = rf; if (IsReusable(rf.Schema.Tag)) { readSteps.Add((rec, d) => recordAccess.AddField(rec, rfInstance.Name, rfInstance.Pos, readItem(recordAccess.GetField(rec, rfInstance.Name, rfInstance.Pos), new BinaryDecoder(new MemoryStream(defaultBytes))))); } else { readSteps.Add((rec, d) => recordAccess.AddField(rec, rfInstance.Name, rfInstance.Pos, readItem(null, new BinaryDecoder(new MemoryStream(defaultBytes))))); } } fieldReaderArray = readSteps.ToArray(); return(recordReader); }