2011-09-29 28 views
7

Tôi đã cố gắng sử dụng protobuf-net với MonoTouch nhưng tôi không biết làm thế nào, và mặc dù có nghe nói rằng nó có thể, tôi đã không thể tìm thấy bất kỳ hướng dẫn hoặc bất kỳ ví dụ mà thực sự làm việc.protobuf-net v2 và Monotouch: Làm thế nào để trộn?

Nó đã được xác nhận bởi Marc Gravell on his blog rằng nó hoạt động trên MonoTouch. Tôi cũng đã xem qua các blog của hai người anh ta nói trong bài viết này, nhưng tôi đã không tìm thấy bất cứ điều gì liên quan đến protobuf.

Không có khách hàng tiềm năng về chủ đề này, tôi quyết định tải xuống protobuf-net và dùng thử. Vì vậy, tôi đã tạo ra các đối tượng sau đây cho mục đích thử nghiệm:

[ProtoContract] 
public class ProtoObject 
{ 
    public ProtoObject() 
    { 

    } 

    [ProtoMember(1)] 
    public byte[] Bytes { get; set; } 
} 

và tôi đã cố gắng để gửi nó qua WCF từ một dịch vụ chạy trên cửa sổ sử dụng một giao diện [ServiceContract] với

[OperationContract] 
ProtoObject GetObject(); 

nhưng trường hợp của ProtoObject nhận được trên thiết bị luôn rỗng. Điều này là không thực sự bất ngờ kể từ khi tôi đã đọc mà để làm cho protobuf-net làm việc với WCF bạn cần phải modify the app.config/web.config.

Hơi khó thực hiện vì dự án MonoTouch không có app.config, nhưng tôi chưa bỏ cuộc. Để thay thế app.config, tôi đã cố gắng thêm ProtoEndpointBehavior vào các hành vi của điểm cuối của máy khách theo chương trình, và ở đó tôi nhấn một bức tường. ProtoBuf.ServiceModel.ProtoEndpointBehavior, có sẵn trên thực thi .NET 3.0 của protobuf-net không có sẵn trên bản phát hành iOS.

Tôi sẽ sử dụng protobuf-net để deserialize các đối tượng nhận được từ điểm cuối WCF dựa trên Windows bằng cách sử dụng tuần tự hóa protobuf-net.

Trả lời

6

Nó thực sự khá giống với mô tả trong số blog entry by Friction Point Studios này. Vì lập trình meta trên thiết bị không thực sự là một lựa chọn, mẹo là tạo trước một dll tuần tự hóa. Điều này có thể được thực hiện bằng cách tạo ra một giao diện điều khiển nhỏ (đây chỉ là một công cụ - nó không được thiết kế để đẹp) mà cấu hình một RuntimeTypeModel (bằng cách thêm các loại bạn quan tâm), và sau đó gọi .Compile(...):

var model = TypeModel.Create(); 
model.Add(typeof (ProtoObject), true); 
model.Compile("MySerializer", "MySerializer.dll"); 

Điều này tạo ra một dll serializer; chỉ đơn giản là tham khảo dll này (cùng với protobuf-net phiên bản iOS), và sử dụng các loại serializer trong dll để tương tác với mô hình của bạn:

var ser = new MySerializer(); 
ser.Serialize(dest, obj); // etc 
0

Chỉ cần mang cái này đến nay có một vài vấn đề với việc sử dụng WCF + Protobuf trên MonoTouch. Như bạn đã quan sát thấy các phiên bản hiện tại của System.ServiceModel và protobuf ánh sáng cho ios không bao gồm tất cả các bit cần thiết.

Tuy nhiên, nếu bạn đi và nhận đầy đủ System.ServiceModel từ Mono repository on GitHub và xây dựng nó với đầy đủ Protobuf source thì bạn có thể làm cho nó hoạt động; Tôi đã làm như vậy.

Bạn cần phải tạo một hội đồng tuần tự hóa bằng cách sử dụng công cụ biên dịch trước rồi chỉnh sửa thuộc tính ProtoOperationBehavior để cung cấp cho nó một số cách để tham chiếu đến hội đồng tuần tự hóa của bạn. Tất cả các thay đổi quá rộng để làm tài liệu ở đây nhưng có thể thực hiện được và nó nhanh hơn lot nhanh hơn DatacontractSerializer khá khủng khiếp trên iOS.

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