2010-03-08 27 views
6

Hallo.Delphi: Chuyển các đối tượng đến các máy tính từ xa

Tôi đang viết phần mềm đặt hàng cấp 2 để sử dụng mạng. Vì vậy, chúng tôi có khách hàng và máy chủ.

Trên máy khách, tôi tạo đối tượng của TBest trong đó ID sản phẩm, số tiền và người dùng đã đặt đơn hàng được lưu. (Vì vậy, đây là một mục của một đơn đặt hàng).

Đơn đặt hàng có thể có nhiều mục và các mục đó được lưu trong một mảng để sau đó gửi lệnh đã tạo tới máy chủ. Lớp giữ mảng được gọi là TBestellung.

Vì vậy, tôi đã tạo ra cả

TBest.toString: string; 

TBest.fromString(source: string): TBest; 

Bây giờ, tôi gửi kết quả toString đến máy chủ thông qua ổ cắm và trên máy chủ tôi có thể tạo các đối tượng sử dụng fromString (phân tích cú pháp của nó các thuộc tính nhận). Điều này hoạt động như dự định.

Câu hỏi: Có cách nào tốt hơn và thanh lịch hơn để làm điều đó không? Serialization là một từ khóa, có, nhưng không phải là khủng khiếp/khó khăn khi bạn serialize một đối tượng (TBestellung trong trường hợp này) có chứa một mảng của các đối tượng khác (TBest trong trường hợp này)?

// Sửa đổi nhỏ: Trước khi được hỏi. Có, tôi nên tạo thêm một lớp (tĩnh) cho toString và fromString vì nếu không máy chủ cần tạo một TBest "trống" để có thể sử dụng fromString.

+2

Không hoàn toàn là câu trả lời nhưng là nhận xét về "Sửa đổi nhỏ" của bạn. Thay vì một lớp tĩnh, bạn có thể muốn một phương thức tĩnh (hoặc một phương thức lớp như chúng được gọi trong Delphi) cho phương thức fromString của bạn trên lớp TBest, nhưng phương thức toString sẽ chỉ là một hàm bình thường trên lớp TBest của bạn. –

+0

awrr, nhập lỗi. tuy nhiên, cảm ơn – Acron

Trả lời

6

Có thư viện serialization miễn phí cho Delphi (cũng cho Free Pascal):

JSON và XML là nền tảng chéo/ngôn ngữ chéo có thể hữu ích cho các giao diện trong tương lai đối với các hệ thống khác như cửa hàng web dựa trên PHP chẳng hạn. Chúng cũng là các tiêu chuẩn mở và miễn phí (không có khóa của nhà cung cấp)

Cập nhật: Tôi sẽ không sử dụng phương pháp tiếp cận dựa trên hàm dựng, trong khi có thể tầm thường khi bắt đầu, (de) serialization có thể trở thành một quá trình phức tạp ngày càng nhiều mã không thuộc lớp cụ thể cho các lớp cần serialization. Thay vào đó, tôi sẽ sử dụng các lớp 'builder'/'parser' (Pattern factory) để giữ cho các trách nhiệm rõ ràng và phụ thuộc thấp.

5

Không, tuần tự hóa một mảng các đối tượng con bên trong một đối tượng chính không đặc biệt lộn xộn hoặc khó khăn nếu mã deserialization biết cách đọc nó. XML làm mọi thứ như thế mọi lúc. Vì vậy, định dạng DFM, và nó hoạt động tuyệt vời.

Không có ma thuật nào liên quan. Tất cả các dữ liệu cần thiết để tạo lại toàn bộ trạng thái của đối tượng cần được truyền từ người gửi đến người nhận theo cách này hay cách khác. Miễn là serializer và deserializer nói cùng một giao thức và người nhận có thể tạo lại cùng một đối tượng mà người gửi đã gửi, thì mã của bạn hoạt động tốt và không cần phải chỉnh sửa trừ khi nó gây ra các vấn đề về hiệu suất quan trọng .

Ngoài ra, WRT sửa đổi nhỏ của bạn, nếu mục đích của TBest.fromString là để tạo ra một đối tượng TBest mới, sau đó nó nên được khai báo là một constructor , không phải là một điều gì tĩnh. Đó là một trong những điều tuyệt vời về Delphi: chúng tôi có thể cung cấp cho các nhà xây dựng của chúng tôi tên thực, mô tả. "Tạo" chỉ là một quy ước.

+0

+1 cho đề xuất hàm tạo. Nếu tôi nghĩ về nó lâu hơn một chút, hy vọng đó là nơi tôi đã kết thúc. ;-) –

+0

+1 cho đề xuất của nhà xây dựng là tốt .D không thấy rằng mặc dù rất rõ ràng .D – Acron

0

Chúng tôi sắp xếp các đối tượng nối tiếp sử dụng lớp cơ sở TStreamable. Các lớp này không có gì khác ngoài việc truyền thông tin giữa các lớp/tầng trong ứng dụng khách/máy chủ DCOM.

Lớp cơ sở biết cách nối tiếp luồng Delphi thông thường từ và đến một mảng biến thể của byte. Các phương thức giao diện trong giao diện DCOM lấy các tham số biến thể mà chúng ta muốn truyền các đối tượng phức tạp giữa máy khách và máy chủ.

Chúng tôi cũng đồng bộ hóa các phiên bản máy khách và máy chủ, vì vậy chúng tôi không có bất kỳ vấn đề về phiên bản nào giữa các phiên bản máy khách và máy chủ khác nhau.

Vì vậy, mỗi lớp con chỉ đọc và ghi vào/từ luồng Delphi và lớp cơ sở nối tiếp với một biến thể.

Đối với bộ sưu tập các đối tượng khác, đối với chúng tôi, đơn giản như đối tượng cha viết số lượng đối tượng chứa vào luồng, sau đó yêu cầu từng đối tượng chứa để nối chính nó vào cùng một luồng. Và đơn giản là đảo ngược quá trình ở đầu bên kia. Nó đi mà không nói rằng các lớp học có chứa cũng kế thừa từ lớp TStreamable cơ bản của chúng tôi.

5

Bạn đã kiểm tra khung công tác từ xa n-tier đã có sẵn cho Delphi chưa? Tôi có thể nhớ của:

Những khung là 5 năm trên thị trường, vì vậy bạn sẽ có được tất cả các chi tiết xấu xí đã giải quyết và thử nghiệm.

Edit: trên nhận xét về giá cả:

  • Datasnap được bao gồm trong doanh nghiệp và Kiến trúc sư phiên bản của Delphi. Nếu bạn có một trong số đó thì đó là "miễn phí", nếu bạn có chuyên gia Delphi, thì bạn sẽ mất phí.
  • kbmMW có một phiên bản miễn phí (kiểm tra trang web của họ)
+0

Đề xuất miễn phí. DataSnap có miễn phí không? – Acron

+0

Lưu ý rằng Datasnap có hai hương vị: 1) DCOM cũ hơn (cung cấp xác thực/ủy quyền/mã hóa, nhưng có thể phức tạp để thiết lập, đặc biệt là không có miền AD) 2) Các dbExpress/TCP/HTTP mới dựa trên. Có thể dễ sử dụng hơn nhưng thiếu tính năng bảo mật. Delphi cũng hỗ trợ SOAP. –

1

Chúng tôi sử dụng HitXML (mã nguồn mở), mà làm tất cả (de) serialization tự động (sử dụng RTTI): http://code.google.com/p/hitxml/

trình OK miễn là bạn sử dụng phương pháp xuất bản (RTTI), và bạn cũng có thể sử dụng tài sản của "mảng TRTTIEnabled".

Các vấn đề liên quan