2009-12-01 2 views
2

Ситуация: Когда я десериализую XML, который содержит возврат каретки, символы отображаются как непечатные символы «коробки», а не как возврат каретки.XML Дезабилизация возвратов каретки вызывает непечатаемые символы

Фон: Пользовательский ввод, собранный с помощью многострочного текстового поля, содержит возврат каретки в тексте. Я сохраняю эти текстовые данные в XML с помощью XML-сериализатора .NET (фрагмент ниже). Когда я позже де-сериализую 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

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

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 

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

+0

+1 Отличный ответ. Этот ответ доходит до сути этого. Я выбрал выбранный ответ только потому, что мой XML будет использоваться в другом месте, а строка кодированной строки перевода строки ( ) приведет к отключению некоторых других пользователей. Ура! –

2

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

В вашем десериализованном тексте коды строк будут отображаться как «\ n».

Одним из подходов было бы заменить «\ n» на NewLine. Например,

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

коды перевода строки будут отображаться как «\ г \ п», который будет выглядеть разумным в WinForms TextBox.

Смежные вопросы