Проблемы с DataContractSerialiser и Serializable - PullRequest
2 голосов
/ 11 марта 2011

У меня есть несколько классов из сборки .Net 2.0.Эти классы создаются с помощью Serializable.

В моем проекте я использую эти классы в своих классах, которые помечены DataContract (IsReference = true) и DataMember.

Теперь у меня есть проблема,с DataContractSerialiser, что он сериализует частные поля моих классов .Net 2.0, которые не будут работать.Но когда я использую XMLSerialiser, я не могу использовать IsReference, и поэтому я также не могу этого сделать.

Существует ли простое (простое) решение для этого?Может быть, у кого-то есть собственный XMLSerializer, который поддерживает ссылки?

Это немного моего кода ....

[DataContract(IsReference = true)]
public class ConnectionConfig: INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void NotifyPropertyChanged(String info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
            PropertyChanged(this, new PropertyChangedEventArgs("ObjectAsString"));
        }
    }

    private PLCConnectionConfiguration _configuration;
    [DataMember]
    public PLCConnectionConfiguration Configuration
    {
        get { return _configuration; }
        set { _configuration = value; NotifyPropertyChanged("Configuration"); }
    }
}

, где PLCConnectionConfiguration происходит из сборки .NET 2.0 и оформленас [Сериализуемым]

Ответы [ 3 ]

0 голосов
/ 11 марта 2011

Вы должны абстрагировать контракты данных WCF от моделей вашего домена .Считайте, что контракты на данные являются представлением модели, которую вы хотите вернуть в своем сервисе.

Аннотируйте ваш контракт данных с атрибутом [DataContract], а все свойства, которые вы хотите предоставить, с атрибутом [DataMember].Если есть свойства, которые вы не хотите возвращать, просто НЕ аннотируйте их атрибутом [DataMember].

Если вы хотите, чтобы ваши доменные модели были XmlSerializable, аннотируйте класс атрибутом [Serializable].

Это может потребовать некоторого дополнительного набора текста и преобразования, но его более понятное общее imho.

0 голосов
/ 17 марта 2011

Возможно, вы могли бы использовать XmlSerializer и указать XmlAttributeOverrides для игнорирования закрытых полей, которые вас не интересуют:

var overrides = new XmlAttributeOverrides();
overrides.Add(typeof(PLCConnectionConfiguration), <name of private field to exclude>, new XmlAttributes { XmlIgnore = true });
...
var serialiser = new XmlSerializer(typeof(ConnectionConfig), overrides);

Очевидно, что вам также нужно пометить свой ConnectionConfig как Serializable и добавить [XmlIgnore] вполе _configuration.

0 голосов
/ 11 марта 2011

Аннотирования типа с помощью [DataContract] должно быть достаточно, чтобы он велел искать членов, отмеченных [DataMember], но похоже, что у вас есть комбинация контрактов данных и ванильных объектов.

Если вам строго необходим xml, я рекомендую написать набор типов DTO и использовать DCS в графическом режиме. Это может потребовать некоторого сопоставления между вашей объектной моделью и DTO; но обычно это не большая проблема. Также обратите внимание, что DCS в графическом режиме имеет тип , а не типичный вывод XML - он будет сильно отличаться от того, что выводит XmlSerializer.

Если вам просто нужно сериализовать произвольные типы (xml не является проблемой), то текущий экспериментальный срез protobuf-net поддерживает все эти сценарии; он будет обрабатывать ссылки на объекты и позволит вам работать как с аннотированными, так и с ванильными типами (вам просто нужно указать, как). Если это вариант, возможно, приведите базовый пример вашей модели, и я мог бы заполнить некоторые пробелы.

...