protobuf-net - protocol buffers library for idiomatic .net
TRANSCRIPT
PROTOBUF-NETLarry Nung
AGENDAIntroductionGetting startedDecorate class
ProtoContractDataContractRuntimeTypeModel
Serialize /DeSerialize DataSerialize /DeSerialize streamSerialize /DeSerialize textSerialize /DeSerialize file
Generate proto fileReferenceQ & A
2
INTRODUCTION3
INTRODUCTION Protocol Buffers library for idiomatic .NET Contract based serializer for .NET code
4
GETTING STARTED5
GETTING STARTED
Reference library
Decorate class
Serialize /DeSerialize
Data
6
REFERENCE LIBRARY
7
REFERENCE LIBRARY
8
DECORATE CLASS[ProtoContract] class Person { [ProtoMember(1)] public int Id {get;set;} [ProtoMember(2)] public string Name {get;set:} [ProtoMember(3)] public Address Address {get;set;} } [ProtoContract] class Address { [ProtoMember(1)] public string Line1 {get;set;} [ProtoMember(2)] public string Line2 {get;set;} }
9
SERIALIZE DATAvar person = new Person { Id = 12345, Name = "Fred", Address = new Address { Line1 = "Flat 1", Line2 = "The Meadows" } }; using (var file = File.Create("person.bin")) { Serializer.Serialize(file, person); }
10
DESERIALIZE DATAPerson newPerson; using (var file = File.OpenRead("person.bin"))
{ newPerson =
Serializer.Deserialize<Person>(file); }
11
DECORATE CLASS12
PROTOCONTRACT[ProtoContract] class Person { [ProtoMember(1)] public int Id {get;set;} [ProtoMember(2)] public string Name {get;set:} [ProtoMember(3)] public Address Address {get;set;} } [ProtoContract] class Address { [ProtoMember(1)] public string Line1 {get;set;} [ProtoMember(2)] public string Line2 {get;set;} }
13
PROTOCONTRACT[ProtoContract] [ProtoInclude(10, typeof(Male))] [ProtoInclude(11, typeof(Female))] class Person { [ProtoMember(1)] public string Name { get; set; }} [ProtoContract] class Male : Person { } [ProtoContract] class Female : Person { } 14
PROTOCONTRACT[ProtoContract(SkipConstructor = true, ImplicitFields =
ImplicitFields.AllFields)] class Person { public string Name { get; set; } public Person(string name) { Name = name; } [ProtoAfterDeserialization] void Validate() { if (string.IsNullOrEmpty(Name)) throw new Exception("Empty name"); } }
15
DATACONTRACT[DataContract] class Person { [DataMember(Order = 1)] public string Name { get; set; } }
16
RUNTIMETYPEMODELclass Person { public string Name { get; set; } } …RuntimeTypeModel.Default .Add(typeof(Person), false); .Add(1, "Name");
17
SERIALIZE /DESERIALIZE DATA18
SERIALIZE /DESERIALIZE STREAMprivate static void SerializeToStream<T>(T
obj, Stream stream) { Serializer.Serialize(stream, obj); }
private static T DeSerializeFromStream<T>(Stream stream) {
return Serializer.Deserialize<T>(stream); }
19
SERIALIZE /DESERIALIZE TEXTprivate static string SerializeToText<T>(T obj) { using (var ms = new MemoryStream(1024)) { SerializeToStream(obj, ms); return Convert.ToBase64String(ms.ToArray()); } }
private static T DeSerializeFromText<T>(string text) { var buffer = Convert.FromBase64String(text); using (var ms = new MemoryStream(buffer)) { return DeSerializeFromStream<T>(ms); } }
20
SERIALIZE /DESERIALIZE FILEpublic virtual void SerializeToFile<T>(T obj, String file, Int32 bufferSize
= 1024) { using (var fs = File.Open(file, FileMode.Create, FileAccess.Write)) { using (var bs = new BufferedStream(fs, bufferSize)) { SerializeToStream(obj, bs); bs.Flush(); } } } public virtual T DeSerializeFromFile<T>(String file, Int32 bufferSize) { using (var fs = File.Open(file, FileMode.Open, FileAccess.Read,
FileShare.ReadWrite)) { using (var bs = new BufferedStream(fs, bufferSize)) { return DeSerializeFromStream<T>(bs); } } }
21
GENERATE PROTO FILE22
GENERATE PROTO FILEprivate static void
GenerateProtoFile<T>(string file) {
File.WriteAllText(file,Serializer.GetProto<T>());
}
23
REFERENCE24
REFERENCE NuGet Gallery | protobuf-net 2.1.0
https://www.nuget.org/packages/protobuf-net/
25
Q&A26
QUESTION & ANSWER
27