Ошибка конструктора XmlSerializer с классом, производным от базового класса

следующий код указывает тип «MyBase64Binary», который является производным от базового класса «TestBase».

using System;
using System.Xml.Serialization;
using System.Collections;
using System.Xml.Schema;
using System.ComponentModel;

namespace Test
{
    public class TestBase
    {
        public TestBase()
        {
        }
    }

    [XmlType(TypeName = "base64Binary"), Serializable]
    public partial class MyBase64Binary : TestBase
    {
        [System.Xml.Serialization.XmlTextAttribute(DataType = "base64Binary")]
        [EditorBrowsable(EditorBrowsableState.Advanced)]
        public Byte[] __Value;

        [XmlIgnore]
        public Byte[] Value
        { 
            get { return __Value; }
            set { __Value = value; }
        }

        public MyBase64Binary()
        {
        }

    }
}

Если я попытаюсь создать XmlSerializer, подобный этому

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;

namespace Test1
{
    class Program
    {
        static void Main(string[] args)
        {
            XmlSerializer s = new XmlSerializer(typeof(Test.MyBase64Binary));
        }
    }
}

из этого я получаю ошибку InvalidOperationException:

{"There was an error reflecting type 'Test.MyBase64Binary'."}

И внутреннее исключение говорит мне следующее:

{"Cannot serialize object of type 'Test.MyBase64Binary'. Consider changing type of XmlText member 'Test.MyBase64Binary.__Value' from System.Byte[] to string or string array."}

Если я не наследую от класса TestBase, то все работает нормально.

Я не понимаю решения. Пожалуйста, помогите.
Что случилось?

Привет из Германии
Ян


person Jan Ryll    schedule 31.03.2010    source источник


Ответы (2)


Если вы измените XmlTextAttribute на XmlAttribute или XmlElement, все должно быть в порядке. Поскольку вы пытались использовать XmlTextAttribute, предполагалось, что это будет какая-то строка. Если вы хотите сериализовать фактический массив байтов, попробуйте XmlAttribute или XmlElement.

person SwDevMan81    schedule 31.03.2010
comment
+1, проблема в атрибуте, он не имеет ничего общего с базовым классом. - person Hans Passant; 31.03.2010
comment
Танки! Кажется, работает! Но почему сериализатор работает, если опустить базовый класс и не наследовать? Не должно ли также возникать исключение? - person Jan Ryll; 31.03.2010
comment
@Jan Столкнулся с той же проблемой. Если базовый класс опущен, он работает. Какое-то странное поведение... - person Sven; 10.02.2017

Помогает ли добавление [Serializable] к вашему базовому классу? Я хотел бы убедиться, что ваш базовый класс также правильно оформлен. Хотя не знаю, поможет это или нет.

person Jaxidian    schedule 31.03.2010
comment
XmlSerializer НЕ использует SerializableAttribute. - person Venemo; 12.10.2011