XmlSerializer перестал работать после обновлений - PullRequest
2 голосов
/ 08 февраля 2012

Я использую XmlSerializer. У меня не было проблем с этим до сих пор. Я обновил Silverlight с 4 до 5 и одновременно обновил службы RIA WCF с v1 SP1 до v1 SP2. Теперь следующая строка дает мне ошибку.

XmlSerializer s = new XmlSerializer(typeof(MyCustomObject));

Ошибка:

System.InvalidOperationException: System.ServiceModel.DomainServices.Client.EntityConflict не может быть сериализовано, поскольку у него нет конструктора без параметров.

Используемый мной объект (MyCustomObject в образце) никоим образом не изменился, поэтому я начинаю думать, что это либо SL5, либо новые RIA Services, которые нарушают мой код. Я не нашел каких-либо критических изменений или упоминаний о том, что это может произойти. Я не знаю, почему у него есть проблема с EntityConflict, так как я не использую никаких сущностей в моем объекте.

Кто-нибудь видел такую ​​ошибку и / или знает, как ее исправить?

UPDATE!

Последнее свойство, которое говорится в сообщении об ошибке перед EntityConflict, является Entity. Я думаю, что это имеет значение, но это работало раньше. Я также хотел бы знать, почему сериализатор уже пытается сериализовать объект в конструкторе?

Ответы [ 3 ]

4 голосов
/ 11 апреля 2012
public static XmlSerializer GetEntityXmlSerializer<TEntity>()
         where TEntity : Entity
{ 
    XmlAttributes ignoreAttribute = new XmlAttributes()
                                    {
                                         XmlIgnore = true,
                                    };

    // use base class of Entity, 
    // if you use type of implementation 
    // you will get the error.
    Type entityType = typeof(Entity);

    var xmlAttributeOverrides = new XmlAttributeOverrides();
    xmlAttributeOverrides.Add(entityType, "EntityConflict", ignoreAttribute);
    xmlAttributeOverrides.Add(entityType, "EntityState", ignoreAttribute);

    return new XmlSerializer(typeof(TEntity), xmlAttributeOverrides);
}
0 голосов
/ 14 февраля 2012

Я справился с этой проблемой, используя промежуточные сериализуемые объекты POCO, которые были копиями моих пользовательских объектов (которые были унаследованы от Entity).Объекты POCO не наследуются от Entity.Я только что обновил их значения из исходных объектов Entity.Затем они сериализовались довольно хорошо.Конечно, при десериализации необходимо обновить объекты Entity из объектов POCO.

0 голосов
/ 09 февраля 2012

Я не уверен, почему это происходит, объекты RIA Services не являются объектами XmlSerializable, а сами объекты не имеют атрибута [Serializable]. Вы добавили частичные классы на стороне клиента, которые украшают объекты с помощью [Serializable], или каким-то образом изменили генерацию кода?

...