Этот XmlWriter не поддерживает данные в кодировке base64 - PullRequest
5 голосов
/ 14 августа 2010

У меня есть такой класс:

public class Data
{
    public string Name { get; set; }
    public int Size { get; set; }
    public string Value { get; set; }

    [NonSerialized] public byte[] Bytes;
}

Когда List<Data> попадает в метод сериализации, указанный ниже, он иногда умирает с

InvalidOperationException "Этот XmlWriter не поддерживаетДанные, закодированные в base64. "

Как видите, я ничего не кодирую напрямую, просто использую механизм сериализации по умолчанию.

private static XDocument Serialize<T>( T source )
{
    var target = new XDocument( );
    var s = new XmlSerializer( typeof( T ) );
    using( XmlWriter writer = target.CreateWriter( ) )
    {
        s.Serialize( writer, source );
    }
    return target;
}

Данные будут иметь свойства Nameэто английские слова, разделенные подчеркиванием.Свойство Value будет аналогичным, за исключением добавления математических операторов или чисел (они являются математическими выражениями).

Кто-нибудь знает, что вызывает это и как я могу это исправить?

1 Ответ

4 голосов
/ 14 августа 2010

Используйте [XmlIgnore] вместо [NonSerialized]. Последний предназначен для SOAP и двоичных форматеров, в соответствии с MSDN :

При использовании BinaryFormatter или Классы SoapFormatter для сериализации объект, используйте NonSerializedAttribute атрибут для предотвращения поля от сериализуется. Например, вы можете используйте этот атрибут, чтобы предотвратить сериализация конфиденциальных данных.

Целевые объекты для Атрибут NonSerializedAttribute общественные и частные поля сериализуемый класс. По умолчанию, классы не сериализуемы, если только они отмечены SerializableAttribute. В течение Процесс сериализации всей публики и частные поля класса сериализуется по умолчанию. Поля помечены с NonSerializedAttribute являются исключено при сериализации. если ты используют класс XmlSerializer для сериализовать объект, используйте Класс XmlIgnoreAttribute для получения та же функциональность.

Имейте в виду, я удивлен, что ваш оригинальный код даже компилируется - когда я пытаюсь это сделать, он говорит, что [NonSerialized] может применяться только к полям ...

...