小编Pha*_*o2k的帖子

使用ServiceStack.Text作为SignalR的JSON Serializer

为了在我的应用程序层中实现一致的序列化,我想对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序列化器?

json signalr

8
推荐指数
1
解决办法
1223
查看次数

使用JSON.Net在Dictionary中复杂类型的特定于用法的序列化

我上课了

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,因此转换器需要以某种方式处理它们).

c# serialization json json.net complextype

3
推荐指数
1
解决办法
2451
查看次数

WCF主机和客户端处于同一进程时的TimeoutException

我遇到了一个非常奇怪的问题.我正在构建一个分布很广的应用程序,其中每个应用程序实例可以是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)

wcf timeoutexception nettcpbinding

1
推荐指数
1
解决办法
1065
查看次数