【问题标题】:How to serialize WCF message using DataContractSerializer?如何使用 DataContractSerializer 序列化 WCF 消息?
【发布时间】:2011-01-18 22:05:56
【问题描述】:

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

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 属性。如果 类型 e 是一个集合,考虑 用 CollectionDataContractAttribute。

可以做什么?

【问题讨论】:

  • 您使用的是什么版本的 .NET?你能确认你没有使用 v3.5(不是 SP1)

标签: c# wcf c#-4.0


【解决方案1】:

Message 类不是数据协定类型或 Xml 序列化器类型。 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));
        }
    }

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-10
      • 1970-01-01
      • 1970-01-01
      • 2014-08-31
      相关资源
      最近更新 更多