/// <summary> /// Adds the field. /// </summary> /// <param name="field">The field.</param> internal void AddField(RecordField field) { if (field == null) { throw new ArgumentNullException("field"); } this.fields.Add(field); this.fiedsByName.Add(field.Name, field); }
private void AddRecordFields( IEnumerable <MemberSerializationInfo> members, Dictionary <string, NamedSchema> schemas, uint currentDepth, RecordSchema record) { int index = 0; foreach (MemberSerializationInfo info in members) { var property = info.MemberInfo as PropertyInfo; var field = info.MemberInfo as FieldInfo; Type memberType; if (property != null) { memberType = property.PropertyType; } else if (field != null) { memberType = field.FieldType; } else { throw new SerializationException( string.Format( CultureInfo.InvariantCulture, "Type member '{0}' is not supported.", info.MemberInfo.MemberType)); } TypeSchema fieldSchema = this.CreateSchema(info.Nullable, memberType, schemas, currentDepth + 1); var aliases = info .Aliases .Select(alias => alias.Contains(".") ? alias : record.Namespace + "." + alias) .ToList(); var recordField = new RecordField( new NamedEntityAttributes(new SchemaName(info.Name), aliases, info.Doc), fieldSchema, SortOrder.Ascending, false, null, info.MemberInfo, index++); record.AddField(recordField); } }
private List <RecordField> BuildReaderFields(RecordSchema w, RecordSchema r, int startPosition) { var readerFieldsWithDefault = r.Fields.Where(field => field.HasDefaultValue); var fieldsToAdd = new List <RecordField>(); foreach (var readerField in readerFieldsWithDefault) { if (!w.Fields.Any(f => this.DoNamesMatch(f, readerField))) { var newField = new RecordField( readerField.NamedEntityAttributes, readerField.TypeSchema, readerField.Order, readerField.HasDefaultValue, readerField.DefaultValue, readerField.MemberInfo, startPosition++) { UseDefaultValue = true }; fieldsToAdd.Add(newField); } } if (r.RuntimeType == typeof(AvroRecord) && r.Fields.Any(rf => !rf.HasDefaultValue && !w.Fields.Any(wf => this.DoNamesMatch(wf, rf)))) { throw new SerializationException( string.Format( CultureInfo.InvariantCulture, "Fields without default values found in type '{0}'. Not corresponding writer fields found.", r.RuntimeType)); } return(fieldsToAdd); }
/// <summary> /// Tries to get a field given its name. /// </summary> /// <param name="fieldName">Name of the field.</param> /// <param name="result">The result.</param> /// <returns>A record field.</returns> public bool TryGetField(string fieldName, out RecordField result) { return(this.fiedsByName.TryGetValue(fieldName, out result)); }
/// <summary> /// Tries to get a field given its name. /// </summary> /// <param name="fieldName">Name of the field.</param> /// <param name="result">The result.</param> /// <returns>A record field.</returns> public bool TryGetField(string fieldName, out RecordField result) { return this.fiedsByName.TryGetValue(fieldName, out result); }
private void VisitCore(RecordField s) { s.Builder = new RecordFieldSerializer(s); this.VisitDynamic(s.TypeSchema); }
private void AddRecordFields( IEnumerable<MemberSerializationInfo> members, Dictionary<string, NamedSchema> schemas, uint currentDepth, RecordSchema record) { int index = 0; foreach (MemberSerializationInfo info in members) { var property = info.MemberInfo as PropertyInfo; var field = info.MemberInfo as FieldInfo; Type memberType; if (property != null) { memberType = property.PropertyType; } else if (field != null) { memberType = field.FieldType; } else { throw new SerializationException( string.Format( CultureInfo.InvariantCulture, "Type member '{0}' is not supported.", info.MemberInfo.MemberType)); } TypeSchema fieldSchema = this.TryBuildUnionSchema(memberType, info.MemberInfo, schemas, currentDepth) ?? this.TryBuildFixedSchema(memberType, info.MemberInfo, record) ?? this.CreateSchema(info.Nullable, memberType, schemas, currentDepth + 1); var aliases = info .Aliases .Select(alias => alias.Contains(".") ? alias : record.Namespace + "." + alias) .ToList(); var recordField = new RecordField( new NamedEntityAttributes(new SchemaName(info.Name), aliases, info.Doc), fieldSchema, SortOrder.Ascending, false, null, info.MemberInfo, index++); record.AddField(recordField); } }
public void SetDeserializableValue(RecordField field, object record, object value) { var r = record as AvroRecord; r[field.Position] = value; }
public object GetSerializableValue(RecordField field, object record) { var r = record as AvroRecord; return r[field.Position]; }
public DynamicRecordFieldSerializer(RecordField schema) { this.schema = schema; }
private bool DoNamesMatch(RecordField w, RecordField r) { return(r.FullName == w.FullName || r.Aliases.Contains(w.FullName)); }
private bool DoNamesMatch(RecordField w, RecordField r) { return r.FullName == w.FullName || r.Aliases.Contains(w.FullName); }
/// <summary> /// Matches if the writer's record contains a field with a name not present in the reader's record, the writer's value for that field is ignored. /// </summary> /// <param name="w">The writer schema.</param> /// <param name="r">The reader schema.</param> /// <returns>True if match.</returns> private List<RecordField> BuildWriterFields(RecordSchema w, RecordSchema r) { var fields = new List<RecordField>(); var writerFields = w.Fields.OrderBy(f => f.FullName); foreach (var writerField in writerFields) { writerField.ShouldBeSkipped = true; RecordField readerField = r.Fields.SingleOrDefault(f => this.DoNamesMatch(writerField, f)); RecordField newField = null; if (readerField != null) { var schema = this.BuildDynamic(writerField.TypeSchema, readerField.TypeSchema); if (schema == null) { throw new SerializationException( string.Format( CultureInfo.InvariantCulture, "Field '{0}' in type '{1}' does not match the reader field.", writerField.Name, w.RuntimeType)); } newField = new RecordField( writerField.NamedEntityAttributes, schema, writerField.Order, writerField.HasDefaultValue, writerField.DefaultValue, readerField.MemberInfo, writerField.Position) { ShouldBeSkipped = false }; } else { newField = new RecordField( writerField.NamedEntityAttributes, writerField.TypeSchema, writerField.Order, writerField.HasDefaultValue, writerField.DefaultValue, writerField.MemberInfo, writerField.Position) { ShouldBeSkipped = true }; } fields.Add(newField); } return fields; }
private List<RecordField> BuildReaderFields(RecordSchema w, RecordSchema r, int startPosition) { var readerFieldsWithDefault = r.Fields.Where(field => field.HasDefaultValue); var fieldsToAdd = new List<RecordField>(); foreach (var readerField in readerFieldsWithDefault) { if (!w.Fields.Any(f => this.DoNamesMatch(f, readerField))) { var newField = new RecordField( readerField.NamedEntityAttributes, readerField.TypeSchema, readerField.Order, readerField.HasDefaultValue, readerField.DefaultValue, readerField.MemberInfo, startPosition++) { UseDefaultValue = true }; fieldsToAdd.Add(newField); } } if (r.RuntimeType == typeof(AvroRecord) && r.Fields.Any(rf => !rf.HasDefaultValue && !w.Fields.Any(wf => this.DoNamesMatch(wf, rf)))) { throw new SerializationException( string.Format( CultureInfo.InvariantCulture, "Fields without default values found in type '{0}'. Not corresponding writer fields found.", r.RuntimeType)); } return fieldsToAdd; }