/// <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);
        }
Exemple #2
0
        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);
        }
Exemple #4
0
 /// <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;
        }