Как сериализовать сообщение WCF с использованием DataContractSerializer? - PullRequest
2 голосов
/ 19 января 2011

Я пытаюсь сериализовать сообщение WCF, используя DataContractSerializer, чтобы получить размер сообщения (без использования средства просмотра трассировки службы). Ниже приведен фрагмент кода:

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 ]

1 голос
/ 21 января 2011

Класс 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));
        }
    }
0 голосов
/ 19 января 2011

Вы можете вызвать WriteMessage(XmlWriter) для экземпляра Message в состоянии Создано, если вам нужно его сериализовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...