2017-06-15 72 views

回答

0

你只是想讓它工作嗎? 絕對最簡單的這樣做的方法是使用protobuf-net並添加[ProtoContract(ImplicitFields = ImplicitFields.AllPublic)]。這是告訴protobuf網組成的字段號碼,它通過採取所有的公衆成員,按字母順序排序,並向上計數。然後,您可以使用您的類型ProtoBuf.Serializer,它應該以您期望的方式行事。

這是簡單,但它不是很健壯。如果您添加,刪除或重命名成員,它可能會全部不同步。這裏的問題是,協議緩衝區格式不包括名稱 - 只有字段號,並且要保證號碼隨着時間的推移要困難得多。如果您的類型可能發生變化,您可能需要明確定義字段編號。例如:

[ProtoContract] 
public class Foo { 
    [ProtoMember(1)] 
    public int Id {get;set;} 

    [ProtoMember(2)] 
    public List<string> Names {get;} = new List<string>(); 
} 

另一件需要注意的事情是非零默認值。默認情況下,protobuf-net會假設某些有關隱式缺省值的內容。如果您經常使用非零值默認值而不使用,那麼protobuf-net可能會誤解您。如果您願意,您可以在全球範圍內關閉此功能:

RuntimeTypeModel.Default.UseImplicitZeroDefaults = false;