首页 > 解决方案 > WCF 自定义序列化

问题描述

我正在使用 .Net Framework WCF。此应用程序接收 json 请求和响应 json 字符串。我想使用我自己的序列化库进行序列化和反序列化操作。

在 asp.net 中,我曾经在 Global.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 中, ReadFromStreamAsyncWriteToStreamAsync被完美触发。但是,在 WCF 中,即使内容类型为“application/json”,它们也不会被触发。

如何自己处理 WCF 序列化?

标签: jsonwcfserialization

解决方案


推荐阅读