CsvHelper ByteArrayConverter Проблема с нулевым значением - PullRequest
0 голосов
/ 25 февраля 2020

У меня возникла небольшая проблема с преобразованием пустого (значение «NULL») Key поля в байтовый массив с помощью CsvHelper, я получаю следующее исключение:

CsvHelper.ReaderException: An unexpected error occurred.
---> System.FormatException: Could not find any recognizable digits.
at System.ParseNumbers.StringToInt(ReadOnlySpan`1 s, Int32 radix, Int32 flags, Int32& currPos)
at System.Convert.ToByte(String value, Int32 fromBase)
at CsvHelper.TypeConversion.ByteArrayConverter.HexStringToByteArray(String hex)
at CsvHelper.TypeConversion.ByteArrayConverter.ConvertFromString(String text, IReaderRow row, MemberMapData memberMapData)
at lambda_method(Closure )
at CsvHelper.Expressions.RecordCreator.Create[T]()
at CsvHelper.Expressions.RecordManager.Create[T]()
at CsvHelper.CsvReader.GetRecord[T]()
--- End of inner exception stack trace ---

отображение настроено так:

public sealed class ZaznamMapping : ClassMap<Zaznam>
{
    public ZaznamMapping(FileSettings configuration)
    {
        var nullValues = new[] { "NULL", "null", string.Empty };

        for (int i = 0; i < configuration.Count(); i++)
        {
            switch (configuration[i])
            {
                case Col.Ignore: continue;
                case Col.Id:     Map(m => m.Id).Index(i).TypeConverterOption.NullValues(nullValues); break;
                case Col.Idd:    Map(m => m.Idd).Index(i).TypeConverterOption.NullValues(nullValues); break;
                case Col.Data:   Map(m => m.Data).Index(i).TypeConverterOption.NullValues(nullValues); break;
                case Col.Key:    Map(m => m.Key).Index(i).TypeConverterOption.NullValues(nullValues); break;
                default: throw new NotSupportedException($"Mapping() - Unknown column \"{configuration[i].ToString()}\"!");
            }
        }
    }
}

И класс Zaznam:

public sealed class Zaznam
{
    public int Id { get; set; }
    public int Idd { get; set; }
    public byte[] Data { get; set; }
    public byte[] Key { get; set; }
}

Значение в файле Key coluimn буквально NULL (как в строке, содержащей буквы " ЗНАЧЕНИЕ NULL"). Разве ByteArrayconverter не должен уважать TypeConverterOptions?

Вопросы:

  • Я что-то не так делаю?
  • Должен ли я вместо этого сделать свой собственный конвертер?

1 Ответ

1 голос
/ 25 февраля 2020

Похоже, что нулевое значение logi c не было добавлено к ByteArrayConverter. Если вы посмотрите на StringConverter, то же значение логики null c отсутствует в методе ConvertFromString для ByteArrayConverter. Вы должны иметь возможность создать свой собственный TypeConverter, чтобы добавить лог c, а затем зарегистрировать его для всех byte[].

public class NullByteArrayConverter : ByteArrayConverter
{
    public override object ConvertFromString(string text, IReaderRow row, MemberMapData memberMapData)
    {
        foreach (var nullValue in memberMapData.TypeConverterOptions.NullValues)
        {
            if (text == nullValue)
            {
                return null;
            }
        }

        return base.ConvertFromString(text, row, memberMapData);
    }
}
csv.Configuration.TypeConverterCache.AddConverter<byte[]>(new NullByteArrayConverter());
...