2011-08-05 15 views
5

Chúng tôi có một ứng dụng rất lớn với nhiều lớp học. Chúng tôi hiện đang chuyển ứng dụng .net này sang IPad bằng Monotouch. Chúng tôi có một số vấn đề với DataContractSerializer và chúng tôi muốn sử dụng bộ nối tiếp protobuf-net của Marc Gravell.Cách di chuyển đúng cách từ WCF DatacontractSerializer sang Protobuf-net?

Giao tiếp giữa máy khách và máy chủ được quản lý bởi Dịch vụ WCF.

Dịch vụ WCF được tạo thành từ một Giao diện được tiếp xúc với máy khách và máy chủ và một giao diện thực hiện giao diện này trên máy chủ.

Giao diện trông giống như rằng:

[ServiceContract] 
public interface IMyService 
{ 
    [OperationContract] 
    SomeObject MyFunction(SomeObject myObject); 
} 

Máy chủ thực hiện bên trông như thế:

[ServiceBehavior(...)] 
public class MyService 
{ 
    public SomeObject MyFunction(SomeObject myObject) 
    { 
    } 
} 

lớp của chúng tôi trông như thế:

[DataContract] 
public class MyClass 
{ 
    [DataMember] 
    public int SomeProp {get; set;} 

    [OnSerialized] 
    public void OnSerialized(StreamingContext context) 
    { 
    } 
} 

Vì vậy, đây là những câu hỏi của tôi :

  • Điều gì sẽ là những thay đổi đối với lớp học của tôi, giao diện wcf và triển khai wcf.

  • Làm cách nào để thay thế WCF DataContractSerializer mặc định thành Bộ nối tiếp Protobuf.

Xin lưu ý rằng trên MonoTouch, tôi chỉ có quyền truy cập vào ProtobufProtobuf.Meta namespace.

[EDIT] Tôi tìm thấy một cách để trao đổi các runtime serializer: Custom WCF DataContractSerializer

Các giải pháp trên sử dụng các DataContractSerializerOperationBehavior. Có Protobuf-net cung cấp hành vi như vậy?

+0

Thứ hai những gì Marc nói: đừng cho rằng chỉ vì bạn có thể hoán đổi bộ nối tiếp trên MS .NET mà bạn có thể thực hiện trong Mono, hãy để MonoTouch. Ngăn WCF của Mono là chưa trưởng thành và MT chỉ thực hiện một tập hợp con từ đó ... – TheNextman

Trả lời

2

Trong tất cả sự trung thực, tôi không quen với các tùy chọn WCF có sẵn cho bạn trong monmotouch; chúng rất khác nhau giữa thường xuyên .NET và Silvelight, ví dụ - và tôi thấy không có lý do gì để giả định rằng monotouch có khả năng trao đổi serializer tại thời gian chạy (mà "đầy đủ" .NET, ít nhất là dưới phiên bản MS). Điều này gây khó khăn cho việc chuyển đổi âm thầm, vì chúng tôi không thể điều khiển vật lộn từ DataContractSerializer.

Như vậy, IMO tùy chọn đơn giản nhất là nắm quyền kiểm soát dữ liệu theo cách thủ công và gửi byte[] thô - lý tưởng với mã hóa MTOM được bật nếu monotouch có thể thực hiện điều đó. Sau đó, khi bạn có byte[], thế giới là động vật thân mềm của bạn, như họ nói.

Thay đổi lại các loại của bạn ... tốt, MyFunction() là một điều kỳ lạ, ở chỗ nó không chuyển bất kỳ dữ liệu nào, vì vậy tôi không chắc chắn bạn muốn tôi đề xuất gì trên dữ liệu đó. Với MyClass, tất cả những gì cần là một số duy nhất (duy nhất trong loại, không phải trên toàn cầu) cho mỗi thành viên, tức là

[DataContract] 
public class MyClass 
{ 
    [DataMember(Order=1)] // <==== this provides the 1 as the key 
    public int SomeProp {get; set;} 

    // see below re callback 
} 

Bạn cũng có một cuộc gọi lại tuần tự; chúng được hỗ trợ đầy đủ, nhưng nó hy vọng sẽ tìm thấy một mẫu quen thuộc - StreamContext không phải là một cái mà tôi biết (mặc dù nó sẽ hoạt động với StreamingContext và một vài loại khác).

Cuối cùng, lưu ý rằng theo mặc định protobuf-net thực hiện hàm tạo, khác với DataContractSerializer. Nếu bạn muốn, bạn có thể ngăn chặn điều này thông qua:

[DataContract(SkipConstructor=true)] 
public class MyClass {...} 

Nếu tôi đã bỏ lỡ ý định ở đây, hãy cho tôi biết.

Lưu ý rằng cũng có nhiều cách để thực hiện tất cả cấu hình mà không thay đổi/thêm bất kỳ thuộc tính nào nếu bạn muốn.

+0

Cảm ơn câu trả lời của bạn Marc. Những gì tôi có nghĩa là để hiển thị trong giao diện của tôi (MyFunction) là tôi có một thuộc tính ServiceContract và một OperationContract. Những gì tôi muốn biết là những thuộc tính này vẫn giữ nguyên? Và tôi đã phạm sai lầm khi gõ exemple của tôi, nó không phải là một StreamContext nhưng một StreamingContext. Tôi sẽ chỉnh sửa bài đăng của mình. –

+0

Và tôi làm cách nào để cấu hình mà không thay đổi bất kỳ thuộc tính nào? –

+0

@Jean - lại câu hỏi thứ hai; "v2" có một 'RuntimeTypeModel' cho phép mọi thứ được cấu hình. Lần đầu tiên - mà không cần thay thế serializer cốt lõi (mà bạn có thể làm trong MS đầy đủ. NET). Do đó đề xuất của tôi sử dụng 'byte []' làm đối tượng cốt lõi trên API, để chúng ta có thể kiểm soát việc tuần tự hóa * bên ngoài * điều này. Không thuận tiện như .NET đầy đủ, tôi đồng ý. Tất nhiên, tại thời điểm đó bạn có thể tự hỏi WCF đang thêm gì cho bạn .... có lẽ một socket thô hoặc HTTP POST đơn giản hơn. –

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