Игнорировать вложенные типы с помощью DataContractSerializer

У меня есть класс на C #, который я пытаюсь сериализовать с помощью DataContractSerializer. Выглядит это примерно так:

namespace Foo
{
    [DataContract(Name = "Bar")]
    class Bar
    {
        class A
        {
            public A(object a, object b, object c)
            {
                d = a;
                e = b;
                f = c;
            }
            public object d;
            public object e;
            public object f;
        }

        [DataMember]
        private ArrayList lst = new ArrayList();
        ...
    }
}

Когда я пытаюсь сериализовать этот класс, я получаю сообщение об ошибке:

"System.Runtime.Serialization.SerializationException: тип 'Foo.Bar + A' с именем контракта данных '...' не ожидается. Рассмотрите возможность использования DataContractResolver, если вы используете DataContractSerializer, или добавьте любые типы, статически неизвестные, в список известные типы ".

Я хочу игнорировать A. Это просто определение типа. Ни один из DataMember, который я пытаюсь сериализовать, не относится к типу A.

Изменить: это код сериализации.

public void Serialize()
{
    var writer = new FileStream("testoutput.xml", FileMode.Create);
    var serializer = new DataContractSerializer(typeof(Bar));
    serializer.WriteObject(writer, this);
    writer.Close();
}

Исключение выбрасывается в serializer.WriteObject.


person Community    schedule 08.02.2017    source источник
comment
Можете ли вы опубликовать код, в котором вы используете сериализацию объекта типа Bar?   -  person peval27    schedule 08.02.2017
comment
@ peval27 отредактировал   -  person    schedule 08.02.2017
comment
@ifangy, ваш код у меня отлично работает. Версия .NET?   -  person peval27    schedule 08.02.2017
comment
@ifangy, вы уверены, что не убрали слишком много вещей из кода?   -  person peval27    schedule 08.02.2017
comment
@ peval27 .NET версии 4.0. Единственное, что я мог бы удалить, - это конструктор и члены данных из A. Bar не объявляет никаких экземпляров A, но он используется в функциях-членах Bar. Редактирование моментально.   -  person    schedule 08.02.2017


Ответы (1)


Поковырявшись еще немного, я смог исправить это вот так:

[KnownType(typeof(A))]
[DataContractAttribute]
class A
{
    public A(object a, object b, object c)
    {
        d = a;
        e = b;
        f = c;
    }
    [DataMember]
    public object d;
    [DataMember]
    public object e;
    [DataMember]
    public object f;
}

Я думаю, что один из Arraylist на самом деле держал As. Этот урок массовый, так что я, наверное, его просто пропустил.

person Community    schedule 08.02.2017