C. David Johnson Ответов: 2

Десериализация перечисления выбирает первое / неправильное значение


Я работаю с файлом третьей стороны, поэтому я не проектировал структуру, и я застрял с ней. По какой-то причине все мои перечисления выбирают первое значение в списке вместо правильного

Во первых вот мой код десериализации

using (var stream = new FileStream(filetoimport, FileMode.Open))
{
    var ser = new XmlSerializer(typeof(MESSAGE));
    var local_loan = (MESSAGE)ser.Deserialize(stream);
    returned = ToDtax(returned, local_loan);
}


Далее идет перечисление
[GeneratedCode("xsd", "4.6.81.0")]
[Serializable]
[XmlType(Namespace = "http://www.mismo.org/residential/2009/schemas", AnonymousType = true)]
public enum LoanIdentifierBase
{
    NotSet,
    AgencyCase,
    InvestorCommitment,
    InvestorContract,
    InvestorLoan,
    InvestorWorkoutCase,
    LenderCase,
    LenderLoan,


Затем есть класс, который имеет перечисление как часть класса
[GeneratedCode("xsd", "4.0.30319.33440")]
[Serializable]
[DebuggerStepThrough]
[DesignerCategory("code")]
[XmlType(Namespace = "http://www.mismo.org/residential/2009/schemas")]
public class LoanIdentifierEnum : BaseClass
{
    [XmlAttribute("SensitiveIndicator")]
    public bool SensitiveIndicator { set; get; }

    [XmlIgnore]
    public bool SensitiveIndicatorSpecified { set; get; }

    [XmlAttribute(Form = XmlSchemaForm.Qualified, Namespace = "http://www.w3.org/1999/xlink", DataType = "NCName")]
    public string label { set; get; }

    [XmlAnyAttribute]
    public XmlAttribute[] AnyAttr { set; get; }

    public LoanIdentifierBase Values { set; get; }


Наконец есть раздел файла импорта который имеет правильные значения но десериализуется с неправильными значениями
<LOAN_IDENTIFIERS>
<LOAN_IDENTIFIER SequenceNumber="1">
   <LoanIdentifier SensitiveIndicator="false">UAT0019</LoanIdentifier>
   <LoanIdentifierType SensitiveIndicator="false">LenderCase</LoanIdentifierType>
</LOAN_IDENTIFIER>


У меня очень ограниченный опыт работы в XML, поэтому любая помощь будет очень полезна

Что я уже пробовал:

Я поставил xmlelement и отображает теги на перечисление. попробовал несколько предложений из онлайн-поиска. Независимо от того что я пытаюсь он всегда возвращается с первой записью из перечисления вместо фактического значения

2 Ответов

Рейтинг:
2

C. David Johnson

Это глупое решение но оно работает,

public LoanIdentifierBase Value { set; get; }


Был изменен на

[XmlText]
public string RealValue { set; get; }

public LoanIdentifierBase Value => (LoanIdentifierBase) Enum.Parse(typeof(LoanIdentifierBase), RealValue);


При этом RealValue приходит как правильное значение и преобразуется в перечисление

HAPPY HAPPY JOY JOY теперь я могу сделать то же самое с более чем тысячей других примеров использования других EnumBase


Рейтинг:
0

Kornfeld Eliyahu Peter

Я использовал этот набор деклараций и все работает хорошо:

public enum LoanIdentifierBase
{
    NotSet,
    AgencyCase,
    InvestorCommitment,
    InvestorContract,
    InvestorLoan,
    InvestorWorkoutCase,
    LenderCase,
    LenderLoan
}

public class LoanIdentifier
{
    [XmlAttribute()]
    public bool SensitiveIndicator { get; set; }
    [XmlText()]
    public string Value { get; set; }
}

public class LoanIdentifierType
{
    [XmlAttribute()]
    public bool SensitiveIndicator { get; set; }
    [XmlText()]
    public LoanIdentifierBase Value { get; set; }
}

public class LOAN_IDENTIFIER
{
    [XmlAttribute()]
    public int SequenceNumber { get; set; }
    [XmlElement()]
    public LoanIdentifier LoanIdentifier { get; set; }
    [XmlElement()]
    public LoanIdentifierType LoanIdentifierType { get; set; }
}

public class LOAN_IDENTIFIERS
{
    [XmlElement(Type = typeof(LOAN_IDENTIFIER))]
    public ArrayList LOAN_IDENTIFIER = new ArrayList();
}


Maciej Los

5ed!

Kornfeld Eliyahu Peter

Спасибо...

C. David Johnson

Хорошо, вы изменились совсем немного, что сделает весь проект, который у меня есть, совершенно неуправляемым. это огромная запутанная структура XML. всего в этой папке проекта находится буквально 3752 файла.

Когда я добавил XMLText поверх Value/LoanIdentifierBase, ошибка сериализатора, которую я получил, была

Невозможно сериализовать объект типа 'Enums.LoanIdentifierEnum'. Рассмотрите возможность изменения типа элемента XmlText 'V331.Enums.LoanIdentifierEnum.Значение' от
V331.EnumBase.LoanIdentifierBase в строку или массив строк.

Из-за структуры, поставляемой поставщиком, я не могу изменить/рефакторинг классов. Если бы не лицо, которое значение перечисления находилось в позиции значения (и именованного значения), то это, скорее всего, не было бы проблемой

Джик это было непонятно раньше вот этот класс

LoanIdentifierEnum общественных класса : Класс
{

[XmlAttribute("SensitiveIndicator")]
public bool SensitiveIndicator { set; get; }

[XmlIgnore]
public bool SensitiveIndicatorSpecified { set; get; }

[Xmlattribute С(Форма = XmlSchemaForm.Квалифицированные, пространство имен = "http://www.w3.org/1999/xlink", "тип данных" = "имя ncname")]
public string label { set; get; }

[XmlAnyAttribute]
public XmlAttribute[] AnyAttr { set; get; }

public LoanIdentifierBase Value { set; get; }
}


И перечисление

LoanIdentifierBase публичных перечисление
{
Нет.,
AgencyCase,
InvestorCommitment,
InvestorContract,
InvestorLoan,
InvestorWorkoutCase,
LenderCase,
Лендерлоан
}

C. David Johnson

Чтобы дать вам представление о масштабах этого проекта, когда я использовал приложение Visual Studios XSD для преобразования XSD в объекты c#, один файл состоял из 75 000 строк кода, и это были только классы и перечисления