Я использую XamlServices
как универсальный механизм сериализации, как описано here, here и here. Хотя это очень хорошо подходит для большинства сценариев, я не понимаю, как получить его для сериализации значений свойств строки, содержащих непечатаемые символы (в частности, нулевые символы).XAML-сериализация свойств двоичной строки
Вот простой пример класса, который я мог бы пожелать, чтобы сериализовать:
public class MyClass
{
public string Value { get; set; }
}
Если я создаю экземпляр этого класса (обратите внимание на нулевой символ в назначенной стоимости недвижимости) ...
var instance = new MyClass
{
Value = "Some\0Value",
};
... и сериализовать его с помощью XamlServices
...
var xaml = XamlServices.Save(instance);
... это исключает исключение hexadecimal value 0x00, is an invalid character.
Я думаю, это означает, что сериализация XAML не поддерживает двоичные строковые данные, поэтому я счастлив преобразовать строку в кодированную форму (например, Base64) во время сериализации.
Я пытался добиться этого преобразования пути создания значения сериалайзера пользовательских XAML, который реализует кодирование Base64 и применяя его к соответствующим свойствам класса ...
public class MyClass
{
[ValueSerializer(typeof(Base64ValueSerializer))]
public string Value { get; set; }
}
... но методы ее преобразование никогда не получают вызов, предположительно потому, что механизм сериализации XAML считает, что при сериализации свойства строки не требуется настраиваемый сериализатор.
Аналогичным образом, я создал настраиваемый конвертер типов с той же целью. Еще раз, метод ConvertTo
не вызывается во время сериализации, хотя, интересно, его метод ConvertFrom
вызывает вызов во время десериализации и правильно заполняет целевое свойство из строковых данных, кодированных Base64.
Я ищу идеи, как получить XamlServices
подчиняться мой обычай TypeConverter
или ValueSerializer
или какие-то другие средства, чтобы заставить мои двоичные значения строки свойств в строку сериализуемой форме.
Если вы сохраните с помощью 'var xaml = System.Windows.Markup.XamlWriter.Save (instance);' и поместите контрольную точку в свой метод 'Base64ValueSerializer' CanConvertToString', он будет удален. Однако, если вы используете 'XamlServices.Save', он не попадает в ValueSerializer. Я не могу найти причину в документации. Не могли бы вы просто сохранить с помощью 'XamlWriter.Save'? –
@Adolfo Perez: это интересное наблюдение, и я определенно буду открыт для использования XamlWriter, если он решает проблему. Однако, обновив свой код, чтобы отразить вашу идею, я вижу, что, несмотря на попадание точки останова в CanConvertToString, он впоследствии не вызывает ConvertToString, поэтому преобразование Base64 по-прежнему не увенчалось успехом. Это разочаровывает, но спасибо за ваше предложение. –
Если вы переопределяете возврат: 'public override bool CanConvertToString (значение объекта, IValueSerializerContext контекст) { var b = base.CanConvertToString (значение, контекст); return true; }. Он будет сериализовать ваш xaml следующим образом: ' ' Where & # x0 - символ unicode для NULL http://www.fileformat.info/info/unicode/char/0000/index.htm –