#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 его не поддерживает.