我刚安装了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) 我正在尝试在我的服务器中使用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)
我很想尝试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.
我在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) 我正在玩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的建议也是受欢迎的.
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有什么问题。将不胜感激您的帮助。
我有一个使用 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) 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
有3个项目:
Server- 游戏服务器Client- 游戏客户端SharedClient-之间共享代码ServerServerClient通过从 发送 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) msgpack ×10
python ×3
c# ×2
messagepack ×2
signalr ×2
zeromq ×2
.net ×1
.net-core ×1
angular ×1
asp.net-core ×1
c++ ×1
datetime ×1
java ×1
node.js ×1
polymorphism ×1
python-3.x ×1
redis ×1
ruby ×1
spyne ×1
stream ×1