Сохранять пробелы / разрывы строк при сериализации через веб-службу ASMX - PullRequest
3 голосов
/ 09 июля 2009

Я выполняю некоторую предварительную обработку документа XML в веб-службе ASMX (устаревшая служба .NET SOAP) для возможного использования в интерфейсе Silverlight.

Я обрабатываю этот XML-документ в POCO-объект для простоты использования. Объект определяется следующим образом:

public class CACDocument : ITextDocument
{
    #region Properties
    public string Title { get; set; }
    public string Text { get; set; }
    public List<Code> CodeList { get; set; }
    public XElement FormatedText { get; set; }
    #endregion

    #region Constructor
    public CACDocument()
    {
        CodeList = new List<Code>();
    }
    #endregion
}

Свойство Text в этом объекте содержит в основном форматированный текст (разрывы строк, пробелы и т. Д.). Узел XML, который передает это свойство, выглядит следующим образом:

<text>
   A TITLE FOLLOWED BY two line breaks


   Some text followed by a line break

   Some more text that might extend for a paragraph or two followed by more line breaks

   Still more text
</text>

Все в порядке, и формат поддерживается, как и следовало ожидать, пока веб-службы не сериализуют данные для отправки во внешний интерфейс. Я предполагаю, что в попытке оптимизировать пропускную способность сериализованный объект удаляет лишние пробелы и разрывы строк из свойства Text перед отправкой. В этом конкретном случае это форматирование важно. Есть ли способ заставить веб-сервис поддерживать форматирование пробелов и разрывов строк?

Я полагаю, что я заменяю некоторое кодирование для рассматриваемых предметов, а затем преобразую обратно на передний конец, но мне это кажется чем-то вроде кома.

Ответы [ 2 ]

5 голосов
/ 09 июля 2009

Вы можете сериализовать его как раздел CDATA:

    [XmlIgnore]
    public string Text { get; set; }

    private static readonly XmlDocument _xmlDoc = new XmlDocument();

    [XmlElement("Text")]
    public XmlCDataSection TextCData
    {
        get
        {
            return _xmlDoc.CreateCDataSection(Text);
        }
        set
        {
            Text = value.Data;
        }
    }

Текст будет сериализован так:

<text><![CDATA[A TITLE FOLLOWED BY two line breaks


   Some text followed by a line break

   Some more text that might extend for a paragraph or two followed by more line breaks

   Still more text]]></text>
2 голосов
/ 09 июля 2009

Полагаю, вы имеете в виду веб-сервисы ASMX?

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


Вы хотите что-то вроде этого:

public class CACDocument : ITextDocument {
    // ...
    [XmlIgnore]
    public string Text {get;set;}

    [XmlText]
    public byte[] TextSubstitute {
        get {return System.Text.Encoding.UTF8.GetBytes(Text);}
        set {Text = System.Text.Encoding.UTF8.GetString(value);}
    }
}

Это не проверено, но вы поймете идею. Вы также можете использовать [XmlElement] вместо [XmlText] и указать другое имя элемента.

...