UnitFests сериализации WCF и этот XmlWriter не поддерживают данные в кодировке base64.Какой писатель я должен использовать? - PullRequest
4 голосов
/ 30 августа 2011

Я пишу некоторые модульные тесты, которые сериализуют и десериализуют все наши типы, которые могут пересекать границу WCF, чтобы доказать, что все свойства перейдут на другую сторону.

Я нажалнемного загвоздки со свойством byte [].

[DataContract(IsReference=true)]
public class BinaryDataObject
{
    [DataMember]
    public byte[] Data { get; set; }
}

Когда я запускаю этот объект через тестирование, я получаю System.NotSupportedException: This XmlWriter does not support base64 encoded data.

Вот мой метод сериализации:

public static XDocument Serialize(object source)
{
  XDocument target = new XDocument();
  using (System.Xml.XmlWriter writer = target.CreateWriter())
  {
    DataContractSerializer s = new DataContractSerializer(source.GetType());
    s.WriteObject(writer, source);
  }
  return target;
}

Мне приходит в голову, что мой метод сериализации должен быть ошибочным - WCF, вероятно, не использует XDocument экземпляров и может не использовать System.Xml.XmlWriter экземпляров.

Что делает WriterWCF использовать по умолчанию?Я хотел бы использовать экземпляры этого типа в моем тесте.

1 Ответ

5 голосов
/ 30 августа 2011

Используя мои навыки рефлектора ниндзя, кажется, что он использует некоторые внутренние типы: подклассы XmlDictionaryWriter . Перепишите ваш Serialize метод следующим образом:

    public static XDocument Serialize(object source)
    {
        XDocument target;
        using (System.IO.MemoryStream stream = new System.IO.MemoryStream())
        using (System.Xml.XmlWriter writer = XmlDictionaryWriter.CreateTextWriter(stream))
        {
            DataContractSerializer s = new DataContractSerializer(source.GetType());
            s.WriteObject(writer, source);
            writer.Flush();
            stream.Position = 0;
            target = XDocument.Load(stream);
        }
        return target;
    }

и все должно быть исправлено.

...