[ Blog ]

c#通过protobuf-csharp-sport 使用protobuf

msg.proto

package tutorial;
message Person {
    required string name = 1;
    required int32 id = 2;
    optional string email = 3;
   
    enum PhoneType {
        MOBILE = 0;
        HOME = 1;
        WORK = 2;
    }
    message PhoneNumber {
        required string number = 1;
        optional PhoneType type = 2 [default = HOME];
    }

    repeated PhoneNumber phone = 4;
}

message AddressBook {
  repeated Person person = 1;
}

(1) 把proto文件放在你解压出来的目录与protoc.exe 、ProtoGen.exe、ProtoGen.exe.config、Google.ProtocolBuffers.dll放于一起。

(2) 打开命令行cmd,定位于对应的目录里面。

输入:protoc –descriptor_set_out=msg.protobin –include_imports msg.proto

msg.protobin是要生成的prtobobin文件,可以使用这个bin文件生成cs文件

再输入protogen msg.protobin  使用该bin文件生成cs文件,这样你就可以得到该msg.cs 的CSharp版文件了,同时在VS里面使用要引入 Google.ProtocolBuffers.dll。为了方便你可以将其做成一个批处理文件代码如下:

echo on
protoc –descriptor_set_out=msg.protobin –include_imports msg.proto

protogen msg.protobin

将其另存为.bat文件即

4.C#代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Google.ProtocolBuffers;
using tutorial;

namespace ProtobufCSharp
{
    class Program
    {
        static void Main(string[] args)
        {
                   
            //序列化
            Person.Builder builder = new Person.Builder();
            builder.SetEmail("kkk@email.com");
            builder.SetId(1);
            builder.SetName("TestName");
            builder.AddPhone(new Person.Types.PhoneNumber.Builder().SetNumber("131111111").SetType(Person.Types.PhoneType.MOBILE));

            builder.AddPhone(new Person.Types.PhoneNumber.Builder().SetNumber("011111").SetType(Person.Types.PhoneType.HOME));

            Person person = builder.Build();

            byte[] buf = person.ToByteArray();

                 //反序列化
            try {

                   
            Person person2 = Person.ParseFrom(buf);

              Console.WriteLine(person2.Id+","+person2.Name + ", " + person2.Email);

              IList<Person.Types.PhoneNumber> lstPhones = person2.PhoneList;

              foreach(Person.Types.PhoneNumber phoneNumber in lstPhones)
                    {

                   Console.WriteLine(phoneNumber.Number);

              }

            } catch (InvalidProtocolBufferException e) {

            // TODO Auto-generated catch block

                    Console.WriteLine(e.Message);

            }

            Console.WriteLine("Finish");
            Console.ReadKey();
        }
    }
}
 Read    Comments Closed

More Posts

CentOS 7 更新源 – 使用国内 163 yum 源

直接打开 163 源网站:http://mirrors.163.com/.help/centos.html 按照使用说明,还是先备份一下源(使用下面的命令重命名原来的源,如果有错误,再改回来): mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 转到源目录: cd /etc/yum.repos.d/ 按照自己的版本下载源,我是CentOS 7,使用命令: wget http://mirrors.163.com/.help/CentOS7-Base-163.repo 运行以下命令生成缓存: yum clean all yum makecache 就这么简单,继续享用 CentOS 7!!!!!

 Read    Comments Closed

gitlab install on centos7

清华大学 TUNA 镜像源 新建 /etc/yum.repos.d/gitlab-ce.repo,内容为 [gitlab-ce] name=gitlab-ce baseurl=http://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7 repo_gpgcheck=0 gpgcheck=0 enabled=1 gpgkey=https://packages.gitlab.com/gpg.key 再执行 sudo yum makecache sudo yum install gitlab-ce sudo gitlab-ctl reconfigure

 Read    Comments Closed

EMA

纯C++实现 这个是EMA算法实现,供在后台调用股票价格数据计算EMA值 std::vector<float> ChanlunTools::Ema(std::vector<float> &X, int N) {     std::vector<float> vec;     int nLen = X.size();     if(nLen >= 1)     {         if(N > nLen) N = nLen;                 vec.resize(nLen);         //vec.reserve(nLen);         vec[0] […]

Tags:
 Read    Comments Closed

NASDAQ Trading Schedule

NASDAQ Trading Schedule Regular Trading Session Schedule The NASDAQ Stock Market Trading Sessions (Eastern Time) Pre-Market Trading Hours from 4:00 a.m. to 9:30 a.m. Market Hours from 9:30 a.m. to 4:00 p.m. After-Market Hours from 4:00 p.m. to 8:00 p.m. Quote and order-entry from 4:00 a.m. to 8:00 p.m. Quotes are open and firm from […]

 Read    Comments Closed

c#当前进程ID

Process.GetCurrentProcess().Id

 Read    Comments Closed

时区

C#判断当前系统当前时区是否使用夏令时(夏时制) 搞了半天还试着引用API,最后发现原来C#2.0本身提供判断当前时区是否使用夏时制的功能. System.TimeZone.CurrentTimeZone.IsDaylightSavingTime(DateTime time); return 布尔值   C++:当tm.tm_isdst = 1(启用夏令时) 时     https://msdn.microsoft.com/zh-cn/library/bb397769(v=vs.110).aspx 在不同时区之间转换时间 转换为协调世界时 协调世界时 (UTC) 是一个高精度的原子时间标准。 世界上的所有时区都可以表示为 UTC 加上或减去一个偏移量。 因此,UTC 提供了一种与时区无关(或非特定于时区)的时间。 如果日期和时间在计算机之间的可迁移性非常重要,则建议使用 UTC 时间。   将指定时区的时间转化为utc TimeZoneInfo.ConvertTimeToUtc(DateTime) 方法可 DateTime easternTime = new DateTime(2007, 01, 02, 12, 16, 00); string easternZoneId = “Eastern Standard Time”; try { TimeZoneInfo easternZone = TimeZoneInfo.FindSystemTimeZoneById(easternZoneId); Console.WriteLine(“The date […]

 Read    Comments Closed

Redi L1 MarketData Fields

AnnHi:? AnnLo:? Ask: Bid: bidask:? AskAtClose:? BidAtClose? AskDir:? BidDir:? AskExchange:? BidExchange:? AskPrice: 与Ask不一样? BidPrice:? AskSize:? BidSize:? BidTick:?An indication of whether the latest bid price is higher, lower or the same as the previous bid. http://www.investopedia.com/terms/b/bidtick.asp AuctionPrice:拍卖价格? AuctionVol:拍卖成交量? BASpread:BidAsk Spread Open: Close: DayHi: DayLo: DayVolume: DayVWAP: ConditionList:? ConsolidatedOpen:? ConsolidatedClose:? ImbalTime:? Imbalance:? IsHalted:? Last:? LastAtClose:? LastExch:? LastPrice:? […]

 Read    Comments Closed

c# 控件更新

在多线程编程中,我们经常要在工作线程中去更新界面显示,而在多线程中直接调用界面控件的方法是错误的做法,Invoke 和 BeginInvoke 就是为了解决这个问题而出现的,使你在多线程中安全的更新界面显示。 正确的做法是将工作线程中涉及更新界面的代码封装为一个方法,通过 Invoke 或者 BeginInvoke 去调用,两者的区别就是一个导致工作线程等待,而另外一个则不会。         public delegate void MyInvoke(string str);         private void btnStartThread_Click(object sender, EventArgs e)         {             Thread thread = new Thread(new ThreadStart(DoWord));             thread.Start();       […]

 Read    Comments Closed

c# RichTextBox 彩色日志

C# RichTextBox显示不同颜色文字 – jex – 博客园 http://www.cnblogs.com/Csharpblogs/articles/2189583.html     #region 日志记录、支持其他线程访问 public delegate void LogAppendDelegate(Color color, string text); /// <summary> /// 追加显示文本 /// </summary> /// <param name="color">文本颜色</param> /// <param name="text">显示文本</param> public void LogAppend(Color color, string text) {     richTextBoxRemote.AppendText("\n");     richTextBoxRemote.SelectionColor = color;     richTextBoxRemote.AppendText(text); } /// <summary> /// 显示错误日志 /// </summary> […]

 Read    Comments Closed

c#创建windows服务

用c#中创建一个windows服务非常简单,与windows服务相关的类都在System.ServiceProcess命名空间下。 每个服务都需要继承自ServiceBase类,并重写相应的启动、暂停、停止等方法。 windows服务的相关信息是存放与注册表中的,所以他可以在不需要用户登录的情况下自动运行,在c#中你不需要再直接向注册表中添加信息了,c#提供了服务安装类 ServiceProcessInstaller和ServiceInstaller来实现服务的安装。 首先,用vs创建一个windows服务项目, windows->windows服务 Service1.cs就是我们需要的服务类,与windows服务相关的基本操作大都可以在这里找到,如:Start,Stop,Pause,Continue等,我们要做的就是根据这些操作做不同的处理就可以了。 下一步添加安装信息 双击项目中的Service.cs转到服务设计界面,在空白处右键选择“添加安装程序” vs会自动创建一个默认名称为ProjectInstaller.cs的文件并转到相应的设计界面 默认添加两个类 serviceProcessInstaller1和serviceInstaller1,第一个主要用来设置服务所属账户,关系到服务的运行,第二个是服务信息描述,如:服务名、是否自动启动等 右键serviceProcessInstaller1属性,将Account属性选择为LocalSystem 右键serviceInstaller1属性,将StartType属性设为Automatic(自动启动),Description为“我的第一个windows服务” 全部保存后生成,找到生成的程序。 由于windows服务不能通过双击直接运行,所以我们需要借助.net提供的InstallUtil.exe来安装服务。 按回车开始安装,成功后会提示 “提交”阶段已成功完成,如果失败则是“回滚”阶段已成功完成 打开windows服务管理器就能看到我们安装的服务,默认服务安装成功后不会立刻启动,需要我们手动启动 到D盘目录下找到Service1.txt,打开会看到我们填入的信息,说明我们做的windows服务已经成功了。 要卸载windows服务可以用InstallUtil.exe /u WindowsService1.exe来卸载或通过系统命令 sc delete 服务名来卸载。

 Read    Comments Closed