Изменение [Сериализуемый] на [DataContract] - PullRequest
2 голосов
/ 20 июля 2010

У меня есть существующий набор классов, которые используют атрибут [Serializable].Мне нужно выставить их в службе WCF, поэтому они должны иметь атрибут [DataContract].Он работает только с Serializable, но затем свойства получают забавные имена, такие как ... k__BackingField.

Эти классы также используются в других местах, и мне интересно, не рискну ли я что-нибудь сломать, заменив атрибут.Кроме того, это возможно, и это хорошая идея, чтобы иметь их обоих?

Спасибо.

Ответы [ 2 ]

5 голосов
/ 20 июля 2010

Когда вы просто указываете DataContractAttribute, но не указываете атрибуты, которые вы специально хотите включить, поведение по умолчанию заключается в сериализации всех полей класса, включая частные.Итак, имена, которые вы получаете, потому что вы используете автоматически реализованные свойства, я полагаю.

Итак, другими словами, измените определение класса, чтобы оно напоминало следующее.Обратите внимание на атрибуты DataMember для свойств, которые я хочу сериализовать.

[DataContract]
public class MyClass {

    [DataMember]
    public string SomeString {
        get;
        set;
    }

    [DataMember]
    public int SomeInt {
        get;
        set;
    }

    public string DontSerializeThis {
        get;
        set;
    }

}

Это приведет к тому, что DataContractSerializer сериализует свойства , а не их вспомогательные поля, созданные компилятором.Однако для этого требуется, чтобы свойства были общими для чтения / записи, потому что они будут проходить через эти средства доступа к свойствам, чтобы получать и устанавливать сериализованные данные.

Другой вариант - изменить автоматически внедряемые свойства на «нормальные»."свойства, что означает добавление собственных полей поддержки.Затем вы можете либо оставить все атрибуты DataMember отключенными, что означает, что все они будут сериализованы, либо добавить атрибуты DataMember в новые поля, которые вы создали, что позволит вам переименовать их в сериализованный вывод, если хотите.

Наконец, к вашему мнению о том, стоит ли делать сериализуемый класс в обеих системах, не совсем так.Если вы хотите, чтобы класс участвовал в классической сериализации с использованием чего-то вроде BinaryFormatter или XmlSerializer, вам следует просто настроить этот сценарий, поскольку DataContractSerializer уже может сериализовать эти классы.

Если ваша цель - быстрая, эффективная, .NET 3+ для связи .NET 3+ (или Silverlight), DataContract - это путь.Если ваша цель - совместимость и / или контроль над представлением XML, придерживайтесь атрибутов сериализации XML.

0 голосов
/ 29 октября 2013

Я думаю, что этот фрагмент кода из ответа Джоша Эйнштейна:

public string DontSerializeThis {
    get;
    set;
}

приведет к появлению свойства, для которого вспомогательное поле сериализуется из-за поведения по умолчанию, упомянутого в том же ответе.Оно должно быть

[IgnoreDataMember]
public string DontSerializeThis {
    get;
    set;
}

Для справки см .: http://msdn.microsoft.com/en-us/library/system.runtime.serialization.ignoredatamemberattribute.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...