开发者

WCF Serialization UnitTests and This XmlWriter does not support base64 encoded data. What Writer should I use?

开发者 https://www.devze.com 2023-04-01 13:54 出处:网络
I\'m writing some unit tests that serialize and deserialize all of our types that might cross the WCF boundary, in order to prove that all properties will make it to the other side.

I'm writing some unit tests that serialize and deserialize all of our types that might cross the WCF boundary, in order to prove that all properties will make it to the other side.

I've hit a bit of a snag with a byte[] property.

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

When I run this object through the testing, I get System.NotSupportedException: This XmlWriter does not support base64 encoded data.

Here's my Serialization method开发者_JAVA技巧:

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;
}

It occurs to me that my serialization method must be flawed - WCF probably doesn't use XDocument instances and might not use System.Xml.XmlWriter instances.

What Writer does WCF use by default? I'd like to use instances of that type in my test.


Using my Reflector ninja skills, it seems like it uses some internal types: subclasses of XmlDictionaryWriter. Rewrite your Serialize method as such:

    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;
    }

and all shall be mended.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号