Delphi Protocol Buffers?

20
有没有人知道有一个在Delphi中实现Google Protocol Buffers的项目?

看起来自己(你自己?)去尝试并不难,只是时间(时间!!)我希望一天有几个小时多一点。 - Stijn Sanders
2
阿门!本来希望能够帮忙而不是从头开始。 - Steven T. Cramer
1
Protocol Buffers 网站:http://code.google.com/p/protobuf/ protobuf-net 是 .net 的实现:http://code.google.com/p/protobuf-net/基于以上内容,这项工作比我最初想象的要更加复杂。 我希望有一个 Delphi 的 win32 或非 .net 版本。 - Steven T. Cramer
5个回答

18

2
看起来正在积极维护。相比之下,被接受的答案似乎已经冻结,自2011年以来从未被触及。 - Warren P

11

自2011年以来,它就没有再被碰过。请参见下面的基础知识答案,该答案似乎仍然在积极维护。 - Warren P
2
版本 1.1 已于 2013 年 4 月发布。 - Pierre-Jean Coudert

2

你最好找/制作一个C++/Delphi桥接程序,而不是重新实现Protocol Buffers。 这个代码库相当庞大。


1

我在github上发现了另一个项目。(该项目从2014年2月开发到2016年7月,截至2017年6月)

它似乎具有初步的proto3支持

我还没有测试过,但可能是目前最好的选择。

https://github.com/stijnsanders/DelphiProtocolBuffer

编辑: 我测试过了,但似乎是用旧版 Delphi 编写的,不支持 Unicode。

我可以编译生成器(使用 10 Seattle),但编译后的可执行文件无法生成 pas 文件 :-(

编辑2:

代码生成器只需将 TStream 替换为 TStreamReader/Writer 即可正常工作。 我确认生成器可以转换最近的 地址簿示例

diff --git a/ProtBufParse.pas b/ProtBufParse.pas
index f29d7c7..cdd734d 100644
--- a/ProtBufParse.pas
+++ b/ProtBufParse.pas
@@ -236,16 +236,13 @@ var

   procedure LoadCode;
   var
-    f:TFileStream;
+    sr:TStreamReader;
   begin
-    f:=TFileStream.Create(FilePath,fmOpenRead or fmShareDenyWrite);
+    sr:=TStreamReader.Create(FilePath, True{DetectBOM});
     try
-      //TODO: UTF-8? UTF-16?
-      CodeL:=f.Size;
-      SetLength(Code,CodeL);
-      if f.Read(Code[1],CodeL)<>CodeL then RaiseLastOSError;
+      Code := sr.ReadToEnd;
     finally
-      f.Free;
+      sr.Free;
     end;
   end;

diff --git a/dpbp.dpr b/dpbp.dpr
index 4049480..b6dab90 100644
--- a/dpbp.dpr
+++ b/dpbp.dpr
@@ -22,7 +22,7 @@ var
   p:TProtocolBufferParser;
   s,t,InputFN,OutputFN,RelPath:string;
   i,j,l,l1:integer;
-  f:TFileStream;
+  sw:TStreamWriter;
   fv:TProtocolBufferParserValue;
   ff:TProtocolBufferParserFlag;
   Flags:TProtocolBufferParserFlags;
@@ -134,11 +134,12 @@ begin

         writeln('Writing '+OutputFN);
         s:=p.GenerateUnit(Flags);
-        f:=TFileStream.Create(OutputFN,fmCreate);
+
+        sw:=TStreamWriter.Create(OutputFN,False,TEncoding.UTF8);
         try
-          f.Write(s[1],Length(s));
+          sw.Write(s);
         finally
-          f.Free;
+          sw.Free;
         end;

       finally

-1

我想知道你对于使用 JSON 或者 BSON(似乎仍在不断发展)作为协议的看法。


看起来协议缓冲更加功能丰富,因为它允许例如可选元素,所以它更接近于 XML+XSD/WSDL / SOAP 协议而不是序列化格式。 - mjn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接