XML десериализация возврата каретки вызывает непечатные символы - PullRequest
2 голосов
/ 01 декабря 2009

Ситуация : При десериализации XML, содержащего возврат каретки, символы отображаются в виде непечатных символов, а не как возврат каретки.

Фон : пользовательский ввод, собранный через многострочное текстовое поле, содержит возврат каретки внутри текста. Я сохраняю эти текстовые данные в XML с помощью сериализатора .NET XML (фрагмент ниже). Когда позднее я десериализовываю данные XML и связываю их с многострочным текстовым полем, символы возврата каретки отображаются в виде непечатных «блоков».

Я знаю, что Windows использует возврат каретки + перевод строки для обозначения конца строки. Я думаю, что сериализация XML может изменить данные (возможно, лишить возврата каретки?).

Вопрос : Есть какие-нибудь идеи, как получить возвращенные десериализованные каретки для правильной визуализации?

Заранее спасибо, -Ed

Фрагмент сериализации

Public Sub SaveApplicationOptions(ByVal AppOptions As ApplicationOptions) Implements IApplicationOptionsRepository.SaveApplicationOptions
  Dim serializer As New XmlSerializer(GetType(ApplicationOptions))
  Dim ApplicationOptionsFilename As String = ConfigurationManager.AppSettings("ApplicationOptionsXML")
  Dim sw As New StreamWriter(ApplicationOptionsFilename)
  serializer.Serialize(sw, AppOptions)
  sw.Close()
  sw.Dispose()
End Sub

Ответы [ 2 ]

3 голосов
/ 01 декабря 2009

Другой подход заключается в использовании XmlAttribute (), как упоминалось здесь . Например:

Imports System.Xml.Serialization

Public Class ApplicationOptions

    Private _someText As String = String.Empty

    <XmlAttribute()> _
    Public Property SomeText() As String
        Get
            Return _someText
        End Get
        Set(ByVal value As String)
            _someText = value
        End Set
    End Property

End Class

Я только что попробовал это на примере приложения, и символы перевода строки не были заменены во время десериализации.

2 голосов
/ 01 декабря 2009

Проблема может заключаться в двух символах, используемых для новых строк - символе перевод строки и символ возврат каретки . Windows, UNIX и Mac используют их по-разному. Синтаксические анализаторы XML изменяют новые строки на один символ перевода строки. Это относится ко всем системам для единообразия.

В вашем десериализованном тексте коды перевода строки скорее всего будут иметь вид "\ n".

Один из подходов заключается в замене "\ n" на NewLine. Например,

DeserializedText = DeserializedText.Replace("\n", Environment.NewLine);

Коды перевода строки будут отображаться как "\ r \ n", что будет выглядеть разумно в текстовом поле WinForms.

...