Ответ 1
Исходя из предположения о типографии, я хотел бы перенаправить вас на эту статью SO, где вместо этого нужно использовать DataContractSerializer
.
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?
}
Теперь, что я могу сделать для его достижения?
Исходя из предположения о типографии, я хотел бы перенаправить вас на эту статью SO, где вместо этого нужно использовать DataContractSerializer
.
Если вы используете 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
с несколькими альтернативами...
Не знаю, можете ли вы использовать DataContract
. Но с этим вы могли бы написать:
[DataContract]
class Person
{
[DataMember]
public string m_name;
[DataMember]
private int m_age;
}
Преимущество DataContract в том, что вы можете сериализовать частные поля и ваш класс, не нуждается в конструкторе по умолчанию.
Какой сериализатор вы используете в настоящее время? Почти все должны работать с этим. Но публичные поля * - это плохая идея. XmlSerializer и JavaScriptSerializer игнорируют закрытых членов. DataContractSerializer и protobuf-net могут работать с частными членами. BinaryFormatter обрабатывает поля (публичные или частные), но это не очень хорошая идея ИМО по многим причинам.
ISerializable? http://msdn.microsoft.com/en-us/library/system.runtime.serialization.iserializable.aspx
Лучше писать собственный сериализатор
http://msdn.microsoft.com/en-us/library/system.runtime.serialization.iserializable.aspx
Используйте IXmlSerializable
интерфейса IXmlSerializable
и поля управления, которые вы хотите сериализовать:
public interface IXmlSerializable
{
XmlSchema GetSchema();
void ReadXml(XmlReader reader);
void WriteXml(XmlWriter writer);
}