C # Как XML сериализации сложного типа в качестве атрибута XML? - PullRequest
0 голосов
/ 06 декабря 2018

Я хочу использовать XmlSerializer для сериализации класса, типичные вещи.Мое ОДНОЕ отличие в том, что я хочу сериализовать пользовательский объект ComplexType как атрибут, а не дочерний элемент.

Я видел другие вопросы о переполнении стека, и в ответах говорится, что это невозможно.Я знаю, что это неправильно.

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

"XmlAttribute / XmlText не может использоваться для кодирования сложных типов."

- или -

"XmlAttribute / XmlText не может быть использован для кодирования типов, реализующих IXmlSerializable."

Просто измените myfield с ComplexType на DateTime, и он отлично работает.DateTime определенно сложен, поэтому мне просто нужно знать, что изменить в классе или атрибутах.

ex: ДА

<Container myComplexType="specialencoding" />

ex: NO

<Container>
   <myComplexType>specialencoding</myComplexType>
</Container>

- Посмотрите, насколько лучше первый ... Я хочу этот.

- Код такой ...

[XmlRoot(ElementName="Container")]
public class Container
{
  [XmlAttribute(AttributeName="myComplexType")]
  public ComplexType myfield = new ComplexType();
}


public class ComplexType
{
    public ComplexType(){}
    public ComplexType(string encoding){}
    public override string ToString() {return "specialencoding";}
}

Если я реализую ComplexType: IXmlSerializable, яполучите второе сообщение об ошибке выше.

Основной используемый сериализатор:

XmlSerializer serializer = new XmlSerializer(typeof(Container));
serializer.serialize("outfile.xml", new Container());

1 Ответ

0 голосов
/ 06 декабря 2018

Попробуйте это:

        private ComplexType _myfield = new ComplexType();

        [XmlAttribute(AttributeName = "myComplexType")]
        public string myfield {
            get { return _myfield.ToString();}
        }
    }
    public class ComplexType
    {
        public ComplexType(){}
        public ComplexType(string encoding){}
        public override string ToString() {return "specialencoding";}
    }
...