2010-11-30 5 views
30
class Person 
{ 
    public string m_name; 
    private int m_age; // << how do I serialize the darn little rat? 
} 

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

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

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

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? 
} 

Что я могу сделать для этого?

+2

Я предполагаю, что public int m_age; должны быть частными? Или нет, нет проблем, не так ли? – 2010-11-30 14:50:21

+3

Какую сериализацию вы пытаетесь сделать? – 2010-11-30 14:53:22

+0

Какой «большой беспорядок» вы получаете? Я не понимаю, почему вы не можете просто вставить [Serializable] в класс и покончить с этим. Возможно, в вашем примере кода есть нечто, что вы упрощаете, что означает, что вы скрываете причину проблемы. – 2010-11-30 15:06:53

ответ

17

Исходя из допущения опечатки, я хотел бы перенаправить вас на this SO article, где вместо этого следует использовать DataContractSerializer.

8

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

Марк каждый класс твой с [Serializable] или вы далеко не уедешь ...

Кроме того, посмотрите это: Why is Serializable Attribute required for an object to be serialized

Так как вам нужно 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; 

Try сериализация/десериализации md несколько альтернатив ...

6

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

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

    [DataMember] 
    private int m_age; 
} 

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

5

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

Смежные вопросы