Пользовательская сериализация WCF

#json #wcf #serialization

#json #wcf #сериализация

Вопрос:

Я использую .Net Framework WCF. Это приложение получает запросы json и отвечает на строку json. Я хотел бы использовать свою собственную библиотеку сериализации для действий сериализации и десериализации.

В asp.net Раньше я делал это в глобальном файле.asax:

 IJsonSerializer serializer = new Serializer();
GlobalConfiguration.Configuration.Formatters.Add(new CustomFormatter(serializer));
 

Вот мой класс форматирования клиента:

 using System.Text;
using System;
using System.IO;
using System.Net.Http;
using System.Net.Http.Formatting;
using System.Net;
using System.Threading.Tasks;

namespace Test.Formatters
{
    public class CustomFormatter: MediaTypeFormatter
    {

        private readonly IJsonSerializer _serializer;

        public CustomFormatter(IJsonSerializer serializer)
        {
            _serializer = serializer;

            SupportedMediaTypes.Add(new System.Net.Http.Headers.MediaTypeHeaderValue("application/json"));
            SupportedMediaTypes.Add(new System.Net.Http.Headers.MediaTypeHeaderValue("text/json"));
            SupportedMediaTypes.Add(new System.Net.Http.Headers.MediaTypeHeaderValue("application/xml"));
            SupportedMediaTypes.Add(new System.Net.Http.Headers.MediaTypeHeaderValue("text/xml"));
            SupportedEncodings.Add(Encoding.UTF8);
            SupportedEncodings.Add(Encoding.Unicode);
        }

        public override bool CanReadType(Type type)
        {
            return true;
        }

        public override bool CanWriteType(Type type)
        {
            return true;
        }

        public override async Task<object> ReadFromStreamAsync(Type type, Stream readStream, HttpContent content, IFormatterLogger formatterLogger)
        {
            StreamReader reader = new StreamReader(readStream);
            string text = await reader.ReadToEndAsync();

            var serializedObj = _serializer.Deserialize(type, text);
            return serializedObj;
        }

        public override async Task WriteToStreamAsync(Type type, object value, Stream writeStream, HttpContent content, TransportContext transportContext)
        {
            var serializedObj = _serializer.Serialize(value);
            var encoding = Encoding.GetEncoding(content.Headers.ContentType.CharSet);
            await writeStream.WriteAsync(encoding.GetBytes(serializedObj), 0, encoding.GetBytes(serializedObj).Length);
        }
    }
}

 

В .NetFramework WebAPI ReadFromStreamAsync и WriteToStreamAsync запускаются идеально.
Однако в WCF они не запускаются, даже если тип содержимого «application / json».

Как я могу самостоятельно справиться с сериализацией WCF?

Комментарии:

1. Я не думаю, что на WCF влияет глобальная конфигурация. Вам нужно включить веб-поведение WCF, попробуйте этот блог ( weblog.west-wind.com/posts/2007/oct/04/wcf-and-json-services )

2. Служба wcf поддерживает только три сериализатора: XmlSerializer, NetDataContractSerializer и DataContractSerializer. Среди них DataContrcatSerializer является сериализатором WCF по умолчанию. Ваш код не работает, потому что WCF его не поддерживает.