Delphi协议缓冲区? 有人知道在Delphi中使用谷歌协议缓冲区实现的一个项目吗? < P>你最好找到/制作一个C++/Delphi桥,而不是重新实现协议缓冲区。代码库相当大。

Delphi协议缓冲区? 有人知道在Delphi中使用谷歌协议缓冲区实现的一个项目吗? < P>你最好找到/制作一个C++/Delphi桥,而不是重新实现协议缓冲区。代码库相当大。,delphi,protocol-buffers,Delphi,Protocol Buffers,我想知道您对使用其中一个(或似乎正在进行的工作)作为协议有何看法。此项目包含Delphi协议缓冲区的实现。从该项目中实施了特定项目所需的有限功能。当时,我认为转移整个项目代码没有任何意义。 此处: 基础协议4.00.01(2013年2月10日) 谷歌协议缓冲区 我在github上找到了。(2014年2月至2016年7月开发,截至2017年6月) 似乎有 我还没有测试,但可能是今天最好的 编辑: 我对此进行了测试,但它似乎是用旧的delphi编写的,不支持unicode 我可以编译生成器(使用1

我想知道您对使用其中一个(或似乎正在进行的工作)作为协议有何看法。

此项目包含Delphi协议缓冲区的实现。从该项目中实施了特定项目所需的有限功能。当时,我认为转移整个项目代码没有任何意义。

此处:

基础协议4.00.01(2013年2月10日)

谷歌协议缓冲区

我在github上找到了。(2014年2月至2016年7月开发,截至2017年6月)

似乎有

我还没有测试,但可能是今天最好的

编辑: 我对此进行了测试,但它似乎是用旧的delphi编写的,不支持unicode

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

EDIT2:

代码生成器只是将TStream替换为TStreamReader/Writer。 我确认发电机可以转换最近的

diff--git a/ProtBufParse.pas b/ProtBufParse.pas
索引f29d7c7..cdd734d 100644
---a/ProtBufParse.pas
+++b/ProtBufParse.pas
@@-236,16+236,13@@var
程序代码;
变量
-f:TFileStream;
+高级:TStreamReader;
开始
-f:=TFileStream.Create(文件路径、fmOpenRead或fmShareDenyWrite);
+sr:=TStreamReader.Create(FilePath,True{DetectBOM});
尝试
-//TODO:UTF-8?UTF-16?
-CodeL:=f.Size;
-设置长度(代码,CodeL);
-如果f.Read(代码[1],CodeL)CodeL,则出现错误;
+代码:=sr.ReadToEnd;
最后
-f.免费;
+高级自由;
结束;
结束;
差异——git a/dpbp.dpr b/dpbp.dpr
索引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:整数;
-f:TFileStream;
+sw:TStreamWriter;
fv:TProtocolBufferParserValue;
ff:TProtocolBufferParserFlag;
标志:TProtocolBufferParserFlags;
@@-134,11+134,12@@begin
writeln(“写入”+输出fn);
s:=p.GenerateUnit(标志);
-f:=TFileStream.Create(OutputFN,fmCreate);
+
+sw:=TStreamWriter.Create(OutputFN,False,TEncoding.UTF8);
尝试
-f.写入[1],长度(s));
+软件写入;
最后
-f.免费;
+西南自由;
结束;
最后

我自己(你自己?)也不难尝试,只是时间(时间!!)我希望我每天多工作几个小时。阿门!希望能提供帮助,而不是从头开始。协议缓冲区站点:protobuf net是一个.net实现:基于上述内容,它肯定比我最初想象的要多。我希望在Delphi中有一个win32或非.net版本。由于协议缓冲区允许示例可选元素,因此它更接近XML+XSD/WSDL/SOAP协议,而不是序列化格式。对于这一点,似乎积极维护+1,而接受的答案似乎是冻结的,自2011年以来从未被触及过。并且自2011年以来再也没有被触及过。有关仍然处于活动状态的基本答案,请参见下文y维护。1.1版已于2013年4月发布。
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