Может внутренний метод set свойства быть сериализированным?

#include <iostream>
#include <string>

using namespace std;

int main()
{
    cout << "Enter the number: ";
    int number;
    cin >> number;
    cout << "Enter names: ";
    string names;

    // USE peek() TO SOLVE IT! ;)
    if (cin.peek() == '\n') {
        cin.ignore(1 /*numeric_limits<streamsize>::max()*/, '\n');
    }

    getline(cin, names);

    return 0;
}

Просто загляните вперед, используя cin.peek(), и посмотрите, остается ли '\n' во внутреннем буфере cin. Если да: проигнорируйте его (в основном пропустите его)

28
задан Patrik Svensson 19 January 2009 в 19:24
поделиться

5 ответов

Если это - опция, DataContractSerializer (.NET 3.0) может сериализировать непубличные свойства:

[DataContract]
public class Person
{
    [DataMember]
    public int ID { get; internal set; }
    [DataMember]
    public string Name { get; set; }
    [DataMember]
    public int Age { get; set; }
}
...
static void Main()
{
    Person person = new Person();
    person.Age = 27;
    person.Name = "Patrik";
    person.ID = 1;

    DataContractSerializer serializer = new DataContractSerializer(typeof(Person));
    XmlWriter writer = XmlWriter.Create(@"c:\test.xml");
    serializer.WriteObject(writer, person);
    writer.Close();
}

С (переформатированным) xml:

<?xml version="1.0" encoding="utf-8"?>
<Person xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://schemas.datacontract.org/2004/07/">
    <Age>27</Age>
    <ID>1</ID>
    <Name>Patrik</Name>
</Person>
54
ответ дан scher 14 October 2019 в 10:23
поделиться

Можно реализовать IXmlSerializable, к сожалению, это инвертирует самое важное преимущество XmlSerializer (способность декларативно управлять сериализацией). DataContractSerializer (xml базирующийся) и BinaryFormatter (базирующийся двоичный файл) мог использоваться в качестве альтернатив XmlSerializer каждый имеющий его за и против.

5
ответ дан Darin Dimitrov 14 October 2019 в 10:23
поделиться

Я думаю, что <забастовка> единственная альтернатива один путь должна реализовать IXmlSerializable и сделать объект xml пишущий / парсинг себя.

Редактирование: После чтения комментариев, DataContractSerializer выглядит интересным;)

4
ответ дан Stormenet 14 October 2019 в 10:23
поделиться

Не то, чтобы я нашел, не делая некоторой работы. Я полагаю, что это вызвано тем, что XmlSerializer, который сгенерирован отражение использования для генерации нового класса (который находится в новом блоке, поэтому не видьте internal участник/методы).

может быть некоторый пробег в использовании XmlSerialization PreCompilier, чтобы генерировать код, и затем изменить его во внутренний класс в Ваших целях, таким образом, Вы тогда сделали бы что-то как:

XmlSerializer serializer = new MyPersonXmlSerializer();

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

1
ответ дан Rowland Shaw 14 October 2019 в 10:23
поделиться

При выполнении сериализации XML "по умолчанию", она только посмотрит на общественные собственности. Реализация IXmlSerializable получит Вас контроль точно, что сериализируется. При выполнении "стандартной" сериализации.NET она посмотрит на поля - не свойства, таким образом, объект будет все еще правильно сериализирован без любой потребности в реализации любых дополнительных интерфейсов.

1
ответ дан Tim Cooper 14 October 2019 в 10:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: