为了在我的应用程序层中实现一致的序列化,我想对SignalR使用相同的序列化库(ServiceStack.Text),我在其他地方使用它.
在关注SignalR的Wiki 条目以替换使用过的JSON Serializer之后,我创建了这个基本的处理程序:
public class SignalrServiceStackJsonSerializer : IJsonSerializer
{
public void Serialize(object value, TextWriter writer)
{
var selfSerializer = value as IJsonWritable;
if (selfSerializer != null)
selfSerializer.WriteJson(writer);
else
JsonSerializer.SerializeToWriter(value, writer);
}
public object Parse(TextReader reader, Type targetType)
{
return JsonSerializer.DeserializeFromReader(reader, targetType);
}
}
Run Code Online (Sandbox Code Playgroud)
积分:
var serializer = new SignalrServiceStackJsonSerializer();
GlobalHost.DependencyResolver.Register(typeof(IJsonSerializer), () => serializer);
Run Code Online (Sandbox Code Playgroud)
不幸的是,在集成它之后,SignalR JS客户端确实获得了与默认序列化器不同的包.看起来,默认的序列化程序生成(至少对于非用户消息)JSON,其属性上限为1个字符,在用ServiceStack.Text替换后不会发生.因此,SignalR尝试访问"我"但收到"Id".我无法找到SignalR服务器端源代码的各个部分.
我做错了什么或者我是否必须创建一个更复杂的包装器来将ServiceStack.Text用作JSON序列化器?
我上课了
public class MyValue
{
public String Prop1 { get; set; }
public String Prop2 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我用它作为普通属性的类型以及字典键.
我需要的是这样一种方式,当这个类被用作属性时,它被序列化为
{"Prop1":"foo","Prop2":"bar"}
Run Code Online (Sandbox Code Playgroud)
但是当它用作Dictionary键时,它的序列化方式是JSON.Net能够正确地反序列化它.
在向MyValue添加ToString()方法时,我能够创建一个允许用作Dictionary键的文本表示(非JSON),但不幸的是,我之后无法反序列化它.即使为MyValue添加JsonConverter也无济于事,因为它似乎无法将非JSON作为源格式处理(另外,当序列化为属性时,它是IS json,因此转换器需要以某种方式处理它们).
我遇到了一个非常奇怪的问题.我正在构建一个分布很广的应用程序,其中每个应用程序实例可以是WCF服务的主机和/或客户端(非常像p2p).一切正常,只要客户端和目标主机(我指的是应用程序,而不是主机,因为目前一切都在一台计算机上运行(所以没有防火墙问题等))不一样.如果它们是相同的,那么应用程序挂起正好1分钟,然后抛出TimeoutException.WCF-Logging没有产生任何帮助.这是一个小应用程序,它演示了这个问题:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void button1_Click(object sender, RoutedEventArgs e)
{
var binding = new NetTcpBinding();
var baseAddress = new Uri(@"net.tcp://localhost:4000/Test");
ServiceHost host = new ServiceHost(typeof(TestService), baseAddress);
host.AddServiceEndpoint(typeof(ITestService), binding, baseAddress);
var debug = host.Description.Behaviors.Find<ServiceDebugBehavior>();
if (debug == null)
host.Description.Behaviors.Add(new ServiceDebugBehavior { IncludeExceptionDetailInFaults = true });
else
debug.IncludeExceptionDetailInFaults = true;
host.Open();
var clientBinding = new NetTcpBinding();
var testProxy = new TestProxy(clientBinding, new EndpointAddress(baseAddress));
testProxy.Test();
}
}
[ServiceContract]
public interface ITestService
{
[OperationContract] …Run Code Online (Sandbox Code Playgroud)