Сериализатор Microsoft Hadoop Avro не поддерживает IEnumerable‹string›

У меня есть класс simlpe с типом свойства IEnumerable. При попытке создать сериализатор с отражением (см. Microsoft .NET SDK для Hadoop) завершается сбоем со следующим исключением.

Не удалось найти подходящий известный тип для «System.Collections.Generic.IEnumerable`1[System.String]».

Но это работает, когда вместо IEnumerable используется строка []

Используемый класс

[DataContract]
public class MyClass
{
    [DataMember]
    public string Field1;

    [DataMember]
    //public string[] Array1; This works
    public IEnumerable<string> Array1; //this doesn't
}

Код

public void CreateSerializer()
{
    var serializer = AvroSerializer.Create<MyClass>();
}

Буду признателен за любую оказанную помощь. Почему IEnumerable не поддерживается или обходной путь.


person haltunbay    schedule 19.08.2015    source источник
comment
Есть новости по этому поводу? Я собирался сделать его сериализованным, но десериализация не работает.   -  person lockwobr    schedule 13.11.2015
comment
Я получил аналогичную ошибку о no known type для списка. Оказывается, каждому типу, используемому в коллекции, нужен атрибут. Для себя я добавил в класс [KnownType(typeof(List<MyCompany.TimedEvent>))], чуть ниже [DataContract]. Я предполагаю, но может быть [KnownType(typeof(IEnumerable<string>)] сработает. Странно, что на strings из коробки не заработало.   -  person Cameron Taggart    schedule 11.01.2016
comment
Та же ошибка, генератор не выдает полный список [KnownType(...) для массивов (мой тип был двумя вложенными массивами, ).   -  person philippeback    schedule 24.05.2016


Ответы (1)


Тип IEnumerable не был пронумерован, поэтому данные внутри неизвестны. Это будет известно только тогда, когда оно будет перечислено. Это происходит, когда вы вызываете, например, ToArray() или ToList().

Поскольку он не был пронумерован, нет смысла сериализовать его, возможно, его невозможно будет пронумеровать после его десериализации, потому что никакие данные не будут сохранены.

Вам нужно будет перечислить его перед сериализацией, преобразовав в массив или список или какой-либо другой конкретный тип коллекции.

person Martin Packwood    schedule 25.11.2015