Сериализация списка объектов в XDocument - PullRequest
1 голос
/ 25 мая 2011

Я пытаюсь использовать следующий код для сериализации списка объектов в XDocument, но я получаю сообщение об ошибке, в котором говорится, что «непробельные символы не могут быть добавлены в контент «

    public XDocument GetEngagement(MyApplication application)
    {
        ProxyClient client = new ProxyClient();
        List<Engagement> engs;
        List<Engagement> allEngs = new List<Engagement>();
        foreach (Applicant app in application.Applicants)
        {
            engs = new List<Engagement>();
            engs = client.GetEngagements("myConnString", app.SSN.ToString());
            allEngs.AddRange(engs);
        }

        DataContractSerializer ser = new DataContractSerializer(allEngs.GetType());

        StringBuilder sb = new StringBuilder();
        System.Xml.XmlWriterSettings xws = new System.Xml.XmlWriterSettings();
        xws.OmitXmlDeclaration = true;
        xws.Indent = true;

        using (System.Xml.XmlWriter xw = System.Xml.XmlWriter.Create(sb, xws))
        {
            ser.WriteObject(xw, allEngs);
        }

        return new XDocument(sb.ToString());
    }

Что я делаю не так? Это конструктор XDocument, который не принимает список объектов? как решить это?

Ответы [ 2 ]

2 голосов
/ 25 мая 2011

Я думаю, что последняя строка должна быть

 return XDocument.Parse(sb.ToString());

И это может быть идея полностью исключить сериализатор, должно быть легко создать XDoc напрямую из List<>. Это дает вам полный контроль над результатом.

Грубо:

var xDoc = new XDocument( new XElement("Engagements", 
         from eng in allEngs
         select new XElement ("Engagement", 
           new XAttribute("Name", eng.Name), 
           new XElement("When", eng.When) )
    ));
0 голосов
/ 25 мая 2011

Ctor XDocument ожидает другие объекты, такие как XElement и XAttribute. Посмотрите на документацию. То, что вы ищете, это XDocument.Parse (...).

Следующее должно работать тоже (не проверено):

XDocument doc = new XDocument();
XmlWriter writer = doc.CreateNavigator().AppendChild();

Теперь вы можете писать прямо в документ, не используя StringBuilder. Должно быть намного быстрее.

...