2013-06-19 27 views
14

Tôi có một assembly với DataContracts và tôi cần tạo lược đồ .proto để nó có thể trao đổi dữ liệu với hệ thống java. Mã DataContracts có thể được thay đổi nhưng tôi không thể thêm các thuộc tính [ProtoContract][ProtoMember] vào nó bởi vì nó sẽ dẫn đến sự phụ thuộc lắp ráp protobuf-net. Chúng tôi sử dụng WCF trong C# phần của hệ thống vì vậy chúng tôi sẽ không muốn có phụ thuộc vào lắp ráp proto-buf trong hầu hết các dự án C# mà không làm việc với hệ thống java.serialization protobuf-net mà không có thuộc tính

Trên trang web protobuf-net trong một phần GettingStarted nó nói rằng:

Không thích Thuộc tính?
Trong v2, mọi thứ có thể được thực hiện với các thuộc tính cũng có thể được cấu hình trong thời gian chạy qua RuntimeTypeModel.

Tuy nhiên tôi không biết cách cấu hình tuần tự hóa mà không có thuộc tính và tôi chưa thấy bất kỳ ví dụ nào về điều đó.

Tôi đang cố gắng để làm

[DataContract] 
public class MyEntity 
{ 
    [DataMember(Order = 1)] 
    public String PropertyA { get; set; } 

    [DataMember(Order = 2)] 
    public int PropertyB { get; set; } 
} 

RuntimeTypeModel.Default.Add(typeof(MyEntity), false); 

string proto = Serializer.GetProto<MyEntity>(); 

Và có được sau làm giá trị của proto

package ProtobufTest; 

message MyEntity { 
} 

Trả lời

12

Làm rõ: hầu hết các câu trả lời này liên quan đến các câu hỏi trước khi chỉnh sửa, nơi false là được chuyển đến RuntimeTypeModel.Add(...)


Tôi đã sử dụng exac của bạn t mã (Tôi suy ra rằng đây là trong namespace ProtobufTest, nhưng phần còn lại là copy/paste từ các câu hỏi) với r2.0.0.640 (việc triển khai NuGet hiện hành), và tôi nhận được:

package ProtobufTest; 

message MyEntity { 
    optional string PropertyA = 1; 
    optional int32 PropertyB = 2 [default = 0]; 
} 

Hơn nữa, bạn sẽ có được số chính xác cùng một kết quả ngay cả khi bạn xóa dòng RuntimeTypeModel.Default.Add(...).

Không rõ với tôi lý do tại sao bạn đang nhìn thấy một cái gì đó khác nhau - bạn có thể làm rõ:

  • mà protobuf-net phiên bản bạn đang sử dụng chính xác
  • nếu những thuộc tính [DataContract]/[DataMember]System.Runtime.Serialization.dll người hoặc của riêng bạn (xin lỗi nếu điều đó có vẻ là một câu hỏi lạ)

Để trả lời câu hỏi đầy đủ: nếu bạn không có bất kỳ thuộc tính nào (a nd những người bạn có chỉ là tốt), bạn cũng có thể làm:

RuntimeTypeModel.Default.Add(typeof(MyEntity), false) 
    .Add(1, "PropertyA") 
    .Add(2, "PropertyB"); 

đó sẽ cấu hình PropertyA như phím 1, và PropertyB như chìa khóa 2.

+0

Cảm ơn phản hồi nhanh chóng! Tôi sử dụng cùng một phiên bản. Tham số thứ hai trong 'RuntimeTypeModel.Default.Add (typeof (MyEntity), ...)' thực sự là 'false'. Với 'true' hoặc không có cuộc gọi đó, tôi nhận được kết quả tương tự như bạn. – Mike

+0

@Giống như ah, đúng; có, rằng 'false' có nghĩa là" không nhìn vào các thuộc tính ", trong đó bao gồm không nhìn vào các thuộc tính' DataMember (Order = n) '.Nếu bạn vượt qua 'false', bạn cần cấu hình nó bằng tay * - đó là những gì tôi đã làm trong ví dụ trên. Nếu bạn muốn sử dụng thuộc tính 'DataMember (Order = n)': giả sử 'true' –

+0

Bằng cách này, sẽ tốt hơn nếu có các phần' .Add (1, "PropertyA") 'để chấp nhận biểu thức là biểu thức thứ hai tham số cho việc đánh máy mạnh và kiểm tra trình biên dịch :) Điều này sẽ dễ dàng làm việc với các loại không được phân bổ. – Mike

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