1737棋牌游戏官网 当前位置:首页>1737棋牌游戏官网>正文

1737棋牌游戏官网

发布时间:2019-02-21

原标题:插上腾飞的翅膀:为asp.net core添加protobuf支持

“你这个白痴,你现在去了是送死吗?蝎子说的不错,你就是太过轻挑了一点,每一次都是准备不周全的,你现在黏土都不过一块去能做什么?”角都用地怨虞捆绑住迪达拉,而迪达拉闻言颤抖了一下身体,因为以前赤砂之蝎就是经常这么对他说的,老是说他准备不周全,经常掉链子让他一阵好等,但是现在没有人再跟他这么罗嗦了,也没有人再变相的关心他了。

集结号号声铃声

“什么?”生命女神表面上无所顾忌可是内心却是震惊无比,这些家伙有办法让她臣服,可是不可能啊,杀死她的话她还能相信,但是要她臣服不可能,主神的精神意念心灵可不是开玩笑的,哪里会那么容易被影响。
牛魔王啧啧称奇,无论是人是妖,修炼到一定境界,体型便不再增长,只以丹田中法力精纯凝厚为目的。这蟒精却不知炼的是何功法,平日修炼却都长了身子,岂不白白浪费了许多造化。便道:“你若能做一件事,我寻高人来帮你解了这个难题,管教你登太乙金仙之位。”

韩非觉得既然人家执意要意思意思了,那陈长官要是再推辞的话,反而不好,看得出来,廖师长很有意在陈长官这里打个桩子,虽然现在陈长官失势,被迫去南洋,可以说是流亡,但在这个乱世之中,谁又能保证陈长官不会东山再起呢?况且陈长官的学生部下几乎遍布整个系统,有了这个桩子在,廖师长以后在军界里混也好说话啊?

没时间解释了,快上车。

通过NuGet获取Zaabee.AspNetCoreProtobuf

Install-Package Zaabee.AspNetCoreProtobuf

在Startup.cs文件中修改ConfigureServices方法

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc(options => { options.AddProtobufSupport(); });
}

搞掂……这时候你就可以通过application/x-protobuf的content-type来让asp.net core使用protobuf来进行序列化/反序列化。

测试代码

在asp.net core项目中添加以下DTO

[ProtoContract]
public class TestDto
{
    [ProtoMember(1)] public Guid Id { get; set; }
    [ProtoMember(2)] public string Name { get; set; }
    [ProtoMember(3)] public DateTime CreateTime { get; set; }
    [ProtoMember(4)] public List<TestDto> Kids { get; set; }
    [ProtoMember(5)] public long Tag { get; set; }
    [ProtoMember(6)] public TestEnum Enum { get; set; }
}

public enum TestEnum
{
    Apple,
    Banana,
    Pear
}

新建一个XUnit项目,通过Nuget引用Microsoft.AspNetCore.TestHost,建立一个测试类

public class AspNetCoreProtobufTest
{
    private readonly TestServer _server;
    private readonly HttpClient _client;

    public AspNetCoreProtobufTest()
    {
        _server = new TestServer(
            new WebHostBuilder()
                .UseKestrel()
                .UseStartup<Startup>());
        _client = _server.CreateClient();
    }

    [Fact]
    public void Test()
    {
        // HTTP Post with Protobuf Response Body
        _client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-protobuf"));

        var dtos = GetDtos();
        var stream = new MemoryStream();
        ProtoBuf.Serializer.Serialize(stream, dtos);

        HttpContent httpContent = new StreamContent(stream);

        // HTTP POST with Protobuf Request Body
        var responseForPost = _client.PostAsync("api/Values", httpContent);

        var result = ProtoBuf.Serializer.Deserialize<List<TestDto>>(
            responseForPost.Result.Content.ReadAsStreamAsync().Result);

        Assert.True(CompareDtos(dtos,result));
    }

    private static bool CompareDtos(List<TestDto> lstOne, List<TestDto> lstTwo)
    {
        lstOne = lstOne ?? new List<TestDto>();
        lstTwo = lstTwo ?? new List<TestDto>();

        if (lstOne.Count != lstTwo.Count) return false;

        for (var i = 0; i < lstOne.Count; i++)
        {
            var dtoOne = lstOne[i];
            var dtoTwo = lstTwo[i];
            if (dtoOne.Id != dtoTwo.Id || dtoOne.CreateTime != dtoTwo.CreateTime || dtoOne.Enum != dtoTwo.Enum ||
                dtoOne.Name != dtoTwo.Name || dtoOne.Tag != dtoTwo.Tag || !CompareDtos(dtoOne.Kids, dtoTwo.Kids))
                return false;
        }

        return true;
    }

    private static List<TestDto> GetDtos()
    {
        return new List<TestDto>
        {
            new TestDto
            {
                Id = Guid.NewGuid(),
                Tag = long.MaxValue,
                CreateTime = DateTime.Now,
                Name = "0",
                Enum = TestEnum.Apple,
                Kids = new List<TestDto>
                {
                    new TestDto
                    {
                        Id = Guid.NewGuid(),
                        Tag = long.MaxValue - 1,
                        CreateTime = DateTime.Now,
                        Name = "00",
                        Enum = TestEnum.Banana
                    },
                    new TestDto
                    {
                        Id = Guid.NewGuid(),
                        Tag = long.MaxValue - 2,
                        CreateTime = DateTime.Now,
                        Name = "01",
                        Enum = TestEnum.Pear
                    }
                }
            },
            new TestDto
            {
                Id = Guid.NewGuid(),
                Tag = long.MaxValue - 3,
                CreateTime = DateTime.Now,
                Name = "1",
                Enum = TestEnum.Apple,
                Kids = new List<TestDto>
                {
                    new TestDto
                    {
                        Id = Guid.NewGuid(),
                        Tag = long.MaxValue - 4,
                        CreateTime = DateTime.Now,
                        Name = "10",
                        Enum = TestEnum.Banana
                    },
                    new TestDto
                    {
                        Id = Guid.NewGuid(),
                        Tag = long.MaxValue - 5,
                        CreateTime = DateTime.Now,
                        Name = "11",
                        Enum = TestEnum.Pear
                    }
                }
            }
        };
    }
}

为什么要用protobuf?

因为快……在我们这边使用业务数据的测试中,protobuf的序列化/反序列化性能大概是Json.net的三倍,序列化后的体积大概只有Json的二分之一,这可以在相当程度上提高webapi的吞吐性能。

另外就是Json对于浮点数的处理存在精度丢失,因为JS的number类型的安全整数是53位。当我们使用雪花算法来提供全局递增ID时会因为精度丢失导致重复主键。而且情况不仅如此,由于同样原因传递DateTime类型也会因为毫秒不一致导致时间匹配错误。一般的解决方法是使用字符串传递,不过这毕竟属于偏方并没有从根源上解决问题,因此我们还是直接使用protobuf来处理。

protobuf的缺点

DTO层必须引用protobuf-net来添加特性,这在一定程度上导致了代码的侵入。基本上DTO属于POCO,依赖第三方包的话总觉得有点不贞洁……另外就是protobuf序列化后的数据不具有可视化,因此如果是使用消息队列或者请求监控的地方,就要综合考虑protobuf是否适合使用场景。

原理

asp.net core是基于中间件方式来实现,其自带默认的JsonFormater(基于Json.net),asp.net core会根据content type来选择对应的Formater来处理对象的序列化,当中包括InputFormatter(反序列化)和OutputFormatter(序列化)。因此除了protobuf,我们还可以添加或者替换其它的序列化方式,例如使用Jil来代替Json.net来提高Json性能。

以上实现以及Demo和测试的源代码已放到GitHub上。

最后给大家拜个晚年,祝大家新年快乐~

编辑:杜杜华北

发布时间:2019-02-21 00:11:23

当前文章:http://neomi.cn/binghuo/3344.html

上游棋牌苹果电脑 炸金花还叫什么名字 港式五张棋牌兑现游戏 比特币创始人中本聪 电脑板真人斗地主 发发棋牌游戏官网 快三预测软件 2点评风月体验网

75566 90739 41288 59490 88730 4188482065 36906 41390

责任编辑:侯丁

随机推荐