#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
. Если да: проигнорируйте его (в основном пропустите его)
Если это - опция, 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>
Можно реализовать IXmlSerializable, к сожалению, это инвертирует самое важное преимущество XmlSerializer (способность декларативно управлять сериализацией). DataContractSerializer (xml базирующийся) и BinaryFormatter (базирующийся двоичный файл) мог использоваться в качестве альтернатив XmlSerializer каждый имеющий его за и против.
Я думаю, что <забастовка> единственная альтернатива забастовка> один путь должна реализовать IXmlSerializable и сделать объект xml пишущий / парсинг себя.
Редактирование: После чтения комментариев, DataContractSerializer выглядит интересным;)
Не то, чтобы я нашел, не делая некоторой работы. Я полагаю, что это вызвано тем, что XmlSerializer
, который сгенерирован отражение использования для генерации нового класса (который находится в новом блоке, поэтому не видьте internal
участник/методы).
может быть некоторый пробег в использовании XmlSerialization PreCompilier, чтобы генерировать код, и затем изменить его во внутренний класс в Ваших целях, таким образом, Вы тогда сделали бы что-то как:
XmlSerializer serializer = new MyPersonXmlSerializer();
другая опция (и вероятно предпочтительный) состоит в том, чтобы реализовать IXmlSerializable, который будет вести автоматически сгенерированный код, чтобы сделать правильную вещь.
При выполнении сериализации XML "по умолчанию", она только посмотрит на общественные собственности. Реализация IXmlSerializable
получит Вас контроль точно, что сериализируется. При выполнении "стандартной" сериализации.NET она посмотрит на поля - не свойства, таким образом, объект будет все еще правильно сериализирован без любой потребности в реализации любых дополнительных интерфейсов.