如何使用DataContractSerializer序列化WCF消息?

时间:2011-01-18 22:05:56

标签: c# wcf c#-4.0

我正在尝试使用DataContractSerializer序列化WCF消息以获取消息大小(不使用服务跟踪查看器)。以下是代码段:

public void BeforeSendReply(ref Message reply, object correlationState)
        {
            byte[] bytes = null;
            var messageBuffer = reply.CreateBufferedCopy(Int32.MaxValue);
            var message = messageBuffer.CreateMessage();
            var dcs = new DataContractSerializer(typeof(Message));
            using (var ms = new MemoryStream())
            {
                dcs.WriteObject(ms, message);
                bytes = ms.ToArray();
                Console.WriteLine(String.Format("Message size = {0}", bytes.Count()));
            }
        }

这样做会引发以下异常:

  

类型   'System.ServiceModel.Channels.BodyWriterMessage'   无法序列化。想法   用它标记它   DataContractAttribute属性,和   标记您想要的所有成员   序列化了   DataMemberAttribute属性。如果   typ e是一个集合,考虑一下   用它标记它   CollectionDataContractAttribute。

可以做些什么?

2 个答案:

答案 0 :(得分:1)

Message类不是数据协定类型或Xml Serializer类型。 WCF特例吧。要查找长度,您的代码应该更像这样:

    public void BeforeSendReply(ref Message reply, object correlationState)
    {
        var messageBuffer = reply.CreateBufferedCopy(Int32.MaxValue);
        var message = messageBuffer.CreateMessage();

        using (var ms = new MemoryStream())
        {
            var xw = XmlWriter.Create(ms);
            message.WriteMessage(xw);
            Console.WriteLine(String.Format("Message size = {0}", ms.Length));
        }
    }

答案 1 :(得分:0)

如果需要序列化,可以在Created状态的WriteMessage(XmlWriter)实例上调用Message