Ошибка десериализации перечисления XmlSerializer на (не существует) пробеле - PullRequest
2 голосов
/ 24 декабря 2010

У меня есть десериализационный объект, который содержит перечисление 'JourneyPatternLinkDirectionEnumeration', он используется в качестве значения для узла 'Направление'.

Когда 'Направление' указано со значением или не указано и представлено в xml как

<Direction />

Все отлично работает. Тем не менее, если он находится в XML как

<Direction></Direction>

Я получаю следующую ошибку:

"Ошибка проверки экземпляра: '' не действительное значение для JourneyPatternLinkDirectionEnumeration. "

Мой код выглядит следующим образом:

var xmlTextReader = new XmlTextReader(xmlDocUri);
xmlTextReader.WhitespaceHandling = WhitespaceHandling.None;
xmlTextReader.Normalization = false;

var serializer = new XmlSerializer(typeof(T),  typeof(T).Assembly.GetTypes());

ouput = (T)serializer.Deserialize(xmlTextReader);

Есть мысли? Есть ли лучший способ сделать это.

(Извините, я не могу опубликовать полный код, документ XML представляет собой документ TransXchange на 65000 строк)

Ответы [ 2 ]

3 голосов
/ 24 декабря 2010

Я не думаю, что у вас есть выбор, если это ошибка, то это ошибка.Измените исходный XML, или объявите свое значение в виде строки, и предоставьте несериализуемое свойство оболочки enum, или создайте класс оболочки для типа enum, который реализует IXmlSerializable.

2 голосов
/ 24 декабря 2010

Есть несколько мест, где пустой (самозакрывающийся) элемент рассматривается как существенно отличающийся от элемента с пустым текстовым содержимым.

Предполагается, что вы не контролируетеисточник, мне интересно, если в этом случае вы должны быть прагматичными и заменить его на строковый член:

public string Direction {
    get { return enumField.ToString(); }
    set { enumField = (EnumType)Enum.Parse(typeof(EnumType), value);}
}
...