Как предотвратить изменения в сериализованном классе после сериализации - PullRequest
3 голосов
/ 16 января 2012

У меня есть этот класс:

[Serializable]
public sealed class Broker
{
    public  int Id;
    public  string Name;
    public  string Hosts;
    public  string DefaultValidatorsNameSpace;
    public  string DefaultRendererNameSpace;
    public  bool IsDefault;
    public  CrmCredentials CrmCredentials;
}

Этот класс десериализуется при загрузке системы из файла xml через XmlSerializer.

Я не хочу позволять программистуизменить содержимое объекта, как только он был загружен.Одним из способов было бы сделать установщик частным, добавив public get; private set; к каждому элементу, но тогда я потеряю свои возможности сериализации.

Ответы [ 2 ]

4 голосов
/ 16 января 2012

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

Кроме того, вам не нужно указывать [Serializable] атрибут для сериализации XML.

0 голосов
/ 16 января 2012

YAXLib - это библиотека XML-сериализации, которая позволяет сериализовать любые нужные поля. Вам не нужно выставлять поля, которые вам нужны для сериализации, публично, вам нужно только установить опцию для сериализации только приписанных полей. Вот как:

[YAXSerializableType(FieldsToSerialize=YAXSerializationFields.AttributedFieldsOnly)]
public sealed class Broker
{
    [YAXSerializableField]
    public  int Id { get; private set; }

    [YAXSerializableField]
    public  string Name { get; private set; }

    // or equaly give attribute to a private field
    [YAXSerializableField]
    private string _hosts;

    // and leave the property un-attributed
    public string Hosts { get { return _hosts; } }

}

Для получения дополнительной информации см .:

http://yaxlib.codeplex.com

и

http://www.codeproject.com/KB/XML/yaxlib.aspx

...