Подтвердить что ты не робот

С# сериализовать члена частного класса

class Person
{
    public string m_name;
    private int m_age; // << how do I serialize the darn little rat?
}

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

Я вынужден создать пользовательскую сериализацию здесь или есть волшебный атрибут для таких членов?
Как упорядочить приватные члены класса?

Изменить # 1:
Хорошо, все, извините за несклонность, я был немного расстроен, когда я написал этот вопрос, через несколько часов после попытки найти решение.
Во всяком случае, вот еще факты:
 1. Я пытаюсь XML-сериализовать этот класс. В настоящее время я использую System.Xml.Serialization.XmlSerializer.
 2. Я сериализации в XML, чтобы иметь совместимость с версией, которая, насколько я понимаю, не предлагает мне это.  3. Я надеялся, что существует определенный атрибут , например:

class Person
{
    public string m_name;
    [SerializeThat(ElementName="Age")]
    private int m_age; // << how do I serialize the darn little rat?
}

ИЛИ (продолжение факта № 3) атрибут , который распространяется на класс, который будет выглядеть следующим образом:

[Serializable(DoPrivate = true, DoProtected = true)]
class Person
{
    public string m_name;
    private int m_age; // << how do I serialize the darn little rat?
}

Теперь, что я могу сделать для его достижения?

4b9b3361

Ответ 1

Исходя из предположения о типографии, я хотел бы перенаправить вас на эту статью SO, где вместо этого нужно использовать DataContractSerializer.

Ответ 2

Если вы используете BinaryFormatter, он будет использоваться для частных частей вашего класса.

Отметьте каждый свой класс с помощью [Serializable] или вы далеко не уйдете...

Кроме того, посмотрите: Почему атрибут Serializable необходим для сериализации объекта

Так как вам нужен XML, возможно, вы можете вытащить себя, хотя все это с помощью SoapFormatter. Видеть this.

Совместимость версий: я использую BinaryFormatter и не имею проблем с обновлением схемы. Попробуйте: пожалуйста, вы сами можете обрабатывать изменения схемы, просто замените нулевые указатели, опущенные Deserialize соответствующими конструкциями по умолчанию. Если вам действительно не нужны функции, предоставляемые XML, перейдите в двоичный файл - вы никогда не оглядитесь назад.

Кроме того, еще один EDIT:

BF будет легко разрешать все ваши множественные ссылки, чтобы он не создавал несколько экземпляров одной и той же ссылки снова и снова. Угадайте, что вы не получите этого с помощью XmlSerializer - очевидно, что ему не место для хранения этой информации.

Пример:

class Data
{
    int a;
}

class ManyData
{
    Data d1;
    Data d2;
}

...

ManyData md=new ManyData();
md.d1=new Data();
md.d2=md.d1;

Попробуйте сериализацию/десериализацию md с несколькими альтернативами...

Ответ 3

Не знаю, можете ли вы использовать DataContract. Но с этим вы могли бы написать:

[DataContract]
class Person
{
    [DataMember]
    public string m_name;

    [DataMember]
    private int m_age;
}

Преимущество DataContract в том, что вы можете сериализовать частные поля и ваш класс, не нуждается в конструкторе по умолчанию.

Ответ 4

Какой сериализатор вы используете в настоящее время? Почти все должны работать с этим. Но публичные поля * - это плохая идея. XmlSerializer и JavaScriptSerializer игнорируют закрытых членов. DataContractSerializer и protobuf-net могут работать с частными членами. BinaryFormatter обрабатывает поля (публичные или частные), но это не очень хорошая идея ИМО по многим причинам.

Ответ 7

Используйте IXmlSerializable интерфейса IXmlSerializable и поля управления, которые вы хотите сериализовать:

public interface IXmlSerializable
{
    XmlSchema GetSchema();
    void ReadXml(XmlReader reader);
    void WriteXml(XmlWriter writer);
}