标签: msgpack

MessagePack比本机node.js JSON慢

我刚安装了node-msgpack并针对原生JSON进行了测试.MessagePack慢得多.谁知道为什么?

使用作者自己的基准......

node ~/node_modules/msgpack/bench.js 
msgpack pack:   4165 ms
msgpack unpack: 1589 ms
json    pack:   1352 ms
json    unpack: 761 ms
Run Code Online (Sandbox Code Playgroud)

node.js messagepack msgpack

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

有一个Spyne客户端的例子吗?

我正在尝试在我的服务器中使用spyne(http://spyne.io)和ZeroMQ和MsgPack.我已按照示例对服务器端进行编程,但我找不到任何帮助我了解如何编程客户端的示例.

我找到了类spyne.client.zeromq.ZeroMQClient,但我不知道它应该是它的构造函数的'app'参数.

先感谢您!

编辑:

(简化的)服务器端代码:

from spyne.application import Application
from spyne.protocol.msgpack import MessagePackRpc
from spyne.server.zeromq import ZeroMQServer
from spyne.service import ServiceBase
from spyne.decorator import srpc
from spyne.model.primitive import Unicode

class RadianteRPC(ServiceBase):    
    @srpc(_returns=Unicode)
    def whoiam():
        return "Hello I am Seldon!"

radiante_rpc = Application(
    [RadianteRPC],
    tns="radiante.rpc",
    in_protocol=MessagePackRpc(validator="soft"),
    out_protocol=MessagePackRpc()
)

s = ZeroMQServer(radiante_rpc, "tcp://127.0.0.1:5001")
s.serve_forever()
Run Code Online (Sandbox Code Playgroud)

python zeromq msgpack spyne

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

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

用户定义的类序列化,C++和msgpack


我很想尝试msgpack.我需要序列化一个对象(用户定义的类的实例),它包含指针(内部树,散列等)和一些基本类型属性.

到目前为止,我可以在msgpack.org wiki的快速示例中执行操作,只需将类序列化为a msgpack::sbuffer,然后读取缓冲区以反序列化.

但现在,我想将该缓冲区发送到文件,或将序列化结果发送到文件,然后将其反序列化.
任何人都可以给我一些如何做的提示吗?我浏览和阅读足够厌倦了:)

我的代码看起来像这样:

msgpack::sbuffer sbuf;
msgpack::pack(sbuf, cluster); //cluster is the instance of my class clustering

//HERE I SHOULD SEND THE BUFFER TO A STREAM FILE, AND THEN LOAD IT IN THE UNPACK;

msgpack::unpacked msg;
msgpack::unpack(&msg, sbuf.data(), sbuf.size()); 
msgpack::object obj = msg.get();
clustering clustUnser
obj.convert(&clustUnser);
Run Code Online (Sandbox Code Playgroud)

谢谢大家!
最好的,
Luchux.

c++ serialization stream msgpack

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

在Redis中存储MessagePacked哈希

我在Redis中存储MessagePacked哈希时遇到问题.我在下面粘贴了一个测试用例.从Redis中提取打包数据并解压缩时,哈希略有损坏.这似乎发生在哈希值超出一定长度时,尽管我不能肯定地说.

我使用的是Redis 2.4.17(默认配置),Ruby 1.9.3p194,MessagePack 0.4.7和Redis gem 3.0.2.使用节点会发生同样的问题,所以我假设问题出在MessagePack或Redis中.有任何想法吗?

require 'redis'
require 'msgpack'

class Test

  def self.run(url)
    redis = Redis.new
    data = {'number' => 13498935756, 'hash' => {'url' => url}}
    redis.set('my_key', MessagePack.pack(data))

    result = MessagePack.unpack(redis.get('my_key'))
    puts result
    puts result['hash']['url'] == data['hash']['url']
  end

end

Test.run('http://fake.example.com')  # works
=>  {"number"=>13498935756, "hash"=>{"url"=>"http://fake.example.com"}}
=>  true

Test.run('http://fakeurl.example.com')  # does not work
=>  {"number"=>13498935756, "hash"=>{"url"=>"ttp://fakeurl.example.com"}}
=>  false
Run Code Online (Sandbox Code Playgroud)

ruby redis messagepack msgpack

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

MessagePack和Subclasses反序列化

我正在玩MessagePack和Java.在序列化工具方面,我曾经有过使用Protobuf和Json(使用Jackson和Gson)的经验.

当涉及到正常的序列化和反序列化时,我完全没有问题.当我想要另一个类的多个子类出现问题时.

我用以下代码测试它:

TestMessage.TestMessageSubClass sub = new TestMessage.TestMessageSubClass(); byte [] pack = MsgPack.pack(sub); Assert.assertTrue(ArrayUtils.isNotEmpty(包));

    List<? extends TestMessage> msg = MsgPack.unpack(pack, TestMessage.class);
    Assert.assertNotNull(msg);
    Assert.assertFalse(msg.isEmpty());
    TestMessage temp = msg.get(0);

    Assert.assertNotNull(temp);
    Assert.assertTrue(temp instanceof TestMessage.TestMessageSubClass);
    TestMessage.TestMessageSubClass sub2 = (TestMessage.TestMessageSubClass) temp;
    Assert.assertEquals(sub, sub2);

    System.out.println(sub);
    System.out.println(sub2);
Run Code Online (Sandbox Code Playgroud)

这两行失败,因为当我反序列化时,我只得到一个普通的TestMessage,而不是一个TestMessageSubClass实例.

    Assert.assertTrue(temp instanceof TestMessage.TestMessageSubClass);
    TestMessage.TestMessageSubClass sub2 = (TestMessage.TestMessageSubClass) temp;
Run Code Online (Sandbox Code Playgroud)

我想这是因为默认情况下,MessagePack解包器无法确定他需要反序列化的确切类.事实上,如果我直接要求他反序列化为TestMessageSubClass,这将工作得很好.

我的要求是TestMessage可能有任意数量的具有额外数​​据的子类,并且使用相同的代码我需要在正确的类实例中对它们进行反序列化而不会丢失任何内容.我可能正在反序列化包含这些TestMessage实例的异构列表的流.

我可以在JacksonJson中使用@JsonSubTypes注释获得我想要的行为.

有没有办法使用官方的MessagePack客户端API并获得它?我自己有一种已知的模式吗?

这是我的MsgPack包装类的代码:GIST

任何有关更有效地使用MessagePack的建议也是受欢迎的.

java polymorphism serialization msgpack

5
推荐指数
0
解决办法
944
查看次数

消息包和日期时间

zeromq我需要一种在 python 多处理进程之间每秒发送 300 条短消息的快速方法。每条消息都需要包含一个IDandtime.time()

msgpack似乎是在通过 发送之前序列化字典的最佳方法zeromq,并且方便地,msgpack有一个正是我需要的示例,除了它有一个datetime.datetime.now().

import datetime

import msgpack

useful_dict = {
    "id": 1,
    "created": datetime.datetime.now(),
}

def decode_datetime(obj):
    if b'__datetime__' in obj:
        obj = datetime.datetime.strptime(obj["as_str"], "%Y%m%dT%H:%M:%S.%f")
    return obj

def encode_datetime(obj):
    if isinstance(obj, datetime.datetime):
        return {'__datetime__': True, 'as_str': obj.strftime("%Y%m%dT%H:%M:%S.%f")}
    return obj


packed_dict = msgpack.packb(useful_dict, default=encode_datetime)
this_dict_again = msgpack.unpackb(packed_dict, object_hook=decode_datetime)
Run Code Online (Sandbox Code Playgroud)

问题是他们的示例不起作用,我收到此错误:

    obj = datetime.datetime.strptime(obj["as_str"], "%Y%m%dT%H:%M:%S.%f")
KeyError: 'as_str'
Run Code Online (Sandbox Code Playgroud)

也许因为我使用的是python 3.4,但我不知道strptime有什么问题。将不胜感激您的帮助。

python datetime zeromq python-3.x msgpack

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

由于升级到 Angular 9 Signalr 不起作用

我有一个使用 signalR 的角度应用程序。它托管在 .NET Core 3.1 应用程序中。升级到 Angular 9 后,signalR 不再有效。在 Angular 8 中一切正常。自更新以来,我一直收到类似的错误

404 错误:无法完成与服务器的协商

无法启动连接

我正在使用 MessagePackHubProtocol。在package.json文件中,我有以下包:

"@microsoft/signalr": "3.1.2",
"@microsoft/signalr-protocol-msgpack":"3.1.2"
Run Code Online (Sandbox Code Playgroud)

在 .NET 核心我有包:

Microsoft.AspNetCore.SignalR.Common 3.1.2 Microsoft.AspNetCore.SignalR.Protocols.MessagePack 3.1.2
Run Code Online (Sandbox Code Playgroud)

我使用的 Typescript 版本是 v3.7.5。我启用了 SSL。


我尝试按照这篇文章中的说明添加 CORS,并且还尝试将以下选项添加到我的客户端应用程序中。

"@microsoft/signalr": "3.1.2",
"@microsoft/signalr-protocol-msgpack":"3.1.2"
Run Code Online (Sandbox Code Playgroud)

不幸的是,两者都不起作用。

启动.cs:

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Server.IISIntegration;
using Microsoft.AspNetCore.SpaServices.AngularCli;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.FileProviders;
using Microsoft.Extensions.Hosting;
using System.IO;


public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration …
Run Code Online (Sandbox Code Playgroud)

msgpack signalr .net-core angular

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

将消息包 + LZ4 压缩与 .NET Signalr 结合使用

MessagePack for C#文档指出,使用 LZ4 压缩可以实现有效负载的紧凑二进制大小。在文档中您可以使用:

var lz4Options = MessagePackSerializerOptions.Standard.WithCompression(MessagePackCompression.Lz4BlockArray);
MessagePackSerializer.Serialize(obj, lz4Options);
Run Code Online (Sandbox Code Playgroud)

所以它基本上说,在调用每个Serialize()Deserialize()方法时,您应该专门指定压缩选项。

但是,在使用.NET Signalr时,您不会直接调用这些方法。Nuget 包 Microsoft.AspNetCore.SignalR.Protocols会为您完成此操作。您只需在ConfigureServices()方法中告诉应用程序serviceCollection 执行此操作:

public void ConfigureServices(IServiceCollection services)
{
     services.AddSignalR().AddMessagePackProtocol();
}
Run Code Online (Sandbox Code Playgroud)

所以我很好奇如何为信号器指定MessagePackSerializationOptions以使用 LZ4 压缩。我已经尝试更改应用程序主要方法中的默认选项配置:

MessagePackSerializer.DefaultOptions = MessagePackSerializerOptions.Standard.WithCompression(MessagePackCompression.Lz4BlockArray);
Run Code Online (Sandbox Code Playgroud)

但首先不推荐,其次它似乎不起作用:D

.net c# msgpack signalr asp.net-core

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

无法加载项目的文件或程序集(未引用时)

有3个项目:

  1. Server- 游戏服务器
  2. Client- 游戏客户端
  3. SharedClient-之间共享代码Server

ServerClient通过从 发送 MessagePack 序列化的类实例来进行通信Shared。当尝试在客户端反序列化一个类实例时

var packet = MessagePackSerializer.Deserialize<IPacket>(packetReader.GetRemainingBytesSegment());
Run Code Online (Sandbox Code Playgroud)

抛出以下异常:

MessagePack.MessagePackSerializationException
  HResult=0x80131500
  Message=Failed to deserialize World2D.Shared.Networking.Packets+IPacket value.
  Source=MessagePack
  StackTrace:
   at MessagePack.MessagePackSerializer.Deserialize[T](MessagePackReader& reader, MessagePackSerializerOptions options)
   at MessagePack.MessagePackSerializer.Deserialize[T](ReadOnlyMemory`1 buffer, MessagePackSerializerOptions options, CancellationToken cancellationToken)
   at World2D.Client.Networking.NetworkingSystem.<>c.<.ctor>b__2_0(NetPeer peer, NetPacketReader packetReader, DeliveryMethod deliveryMethod) in C:\Users\dclip\Desktop\world2d\client\world2d\src\Networking\NetworkingSystem.cs:line 25
   at LiteNetLib.NetManager.ProcessEvent(NetEvent evt)
   at LiteNetLib.NetManager.PollEvents()
   at World2D.Client.Networking.NetworkingSystem.Update(GameTime gameTime) in C:\Users\dclip\Desktop\world2d\client\world2d\src\Networking\NetworkingSystem.cs:line 51
   at MonoGame.Extended.Entities.World.Update(GameTime gameTime) in C:\Users\dclip\Desktop\world2d\shared\Shared\MonoGame.Extended\MonoGame.Extended.Entities\World.cs:line 89
   at World2D.Client.Game1.Update(GameTime gameTime) in C:\Users\dclip\Desktop\world2d\client\world2d\Game1.cs:line 36
   at Microsoft.Xna.Framework.Game.DoUpdate(GameTime …
Run Code Online (Sandbox Code Playgroud)

c# msgpack

5
推荐指数
0
解决办法
530
查看次数