2010-01-27 6 views
17

Кто-нибудь знает о проекте для реализации буферов протокола Google в Delphi?Буферы протокола Delphi?

+0

не похоже, что трудно иметь пойти на это сам (сам?), это только время (время !!) Если бы я был несколько часов больше в день. –

+2

Аминь! Хотел помочь и не начинать с нуля. –

+1

Сайт протокольных буферов: http://code.google.com/p/protobuf/ protobuf-net - это реализация .net: http://code.google.com/p/protobuf-net/ Основываясь на над ним должно быть больше работы, чем я думал раньше. Я хотел бы получить версию win32 или non .net в Delphi. –

ответ

9

Этот проект содержит реализацию протокольных буферов для Delphi. Из проекта была реализована ограниченная функциональность, необходимая для конкретного проекта. В то время я не вижу смысла передавать весь код проекта. http://sourceforge.net/projects/protobuf-delphi/

+0

и не был затронут снова с 2011 года. См. Ниже для ответа на основные вопросы, который по-прежнему активно поддерживается. –

+1

Версия 1.1 выпущена в апреле 2013 года. –

2

Возможно, вам лучше найти/создать мост C++/Delphi, а не повторять реализацию буферов протокола. Кодовая база довольно большая.

0

Интересно, что вы думаете об использовании либо JSON, либо BSON похоже на незавершенное производство) в качестве протокола.

+0

Похоже, что буферы протокола более функциональны, поскольку они позволяют, например, добавлять дополнительные элементы, поэтому он ближе к протоколу XML + XSD/WSDL/SOAP, чем к формату сериализации – mjn

14

Здесь:

Основы протокола Буферы 4.00.01 (10 фев 2013)

Google протокола Буферы

http://fundementals.sourceforge.net/dl.html

+2

Появляется для активного обслуживания. +1 для этого, тогда как принятый ответ кажется замороженным и никогда не касался с 2011 года. –

1

Я нашел another one на GitHub. (с февраля 2014 года по июль 2016 года)

Кажется, что preliminary proto3 support.

Я еще не тестировал, но на сегодняшний день это может быть лучшим.

https://github.com/stijnsanders/DelphiProtocolBuffer

EDIT: Я испытал это, но это, кажется, написано в старых Дельфах и не Юникод.

Я мог бы составить генератор (используя 10 Сиэтл), но скомпилирован ехе не удалось создать файл па :-(

edit2:

Генератор кода работает только замена TStream на TStreamReader/Writer . Я подтвердил, генератор может преобразовать недавнюю address book sample.

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