Bltoolkit, DataContractSerializer и абстрактные классы.
От: MockBu4  
Дата: 13.12.10 14:14
Оценка:
Подскажите, пожалуйста, в следующей ситуации.
Использую Bltoolkit, достаю данные с помощью DataAccessor. Хочу сериализовать полученные объекты с помощью DataContractSerializer.
К примеру, такая модель:


[BLTDataContract]
    public abstract class Person
    {        
        public abstract int Id { get; set; }
        public abstract DateTime Created { get; set; }
        [MapField("Identity{0}")]
        public Identity Identity { get; set; }
    }
 [BLTDataContract]
    public abstract class Identity
    {
        public abstract string Name { get; set; }
        public abstract Gender Gender { get; set; }        
    }


,где


public class BLTDataContractAttribute : GenerateAttributeAttribute
    {
        public BLTDataContractAttribute()
            : base(typeof(DataContractAttribute))
        {

        }
    }



Пытаемся сделать следующее

 public void DataContractInPersonObjectGenerateTest()
        {
            Person person = TypeAccessor<Person>.CreateInstance();
            person.Id = 1;
            person.DateCreated = DateTime.Now;

            var type=person.GetType();

            DataContractAttribute attr = (DataContractAttribute)
               Attribute.GetCustomAttribute(type, typeof(DataContractAttribute));

            Assert.NotNull(attr); // Ok! 

            var fileName = "testPerson.xml";
            var settings = new XmlWriterSettings() { Indent = true };
            using (var writer = XmlWriter.Create(fileName, settings))
            {
                var sr = new DataContractSerializer(type);
                sr.WriteObject(writer, person); // Error!
            }
            Assert.True(File.Exists(fileName));            
        }



В результате InvalidDataContractException {"Type 'BLToolkitExtension.Person' cannot inherit from a type that is not marked with DataContractAttribute or SerializableAttribute. Consider marking the base type 'ConsoleApplication5.Person' with DataContractAttribute or SerializableAttribute, or removing them from the derived type}

Хотя DataContractAttribute извлекся из сгенеренного типа.

Подскажите, пожалуйста, что делать в этой ситуации?
P.S. В коде опустил использование обертки для DataMemberAttribute.
Re: Bltoolkit, DataContractSerializer и абстрактные классы.
От: k.o. Россия  
Дата: 13.12.10 14:48
Оценка:
Здравствуйте, MockBu4, Вы писали:

MB>Подскажите, пожалуйста, в следующей ситуации.

MB>Использую Bltoolkit, достаю данные с помощью DataAccessor. Хочу сериализовать полученные объекты с помощью DataContractSerializer.
MB>К примеру, такая модель:

MB>В результате InvalidDataContractException {"Type 'BLToolkitExtension.Person' cannot inherit from a type that is not marked with DataContractAttribute or SerializableAttribute. Consider marking the base type 'ConsoleApplication5.Person' with DataContractAttribute or SerializableAttribute, or removing them from the derived type}


MB>Хотя DataContractAttribute извлекся из сгенеренного типа.


Правильно, из сгенерированного типа он извлёкся, а сообщение об ошибке говорит об отсутствии DataContractAttribute у базового класса, т.е. ConsoleApplication5.Person.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.