Skip to content

Latest commit

 

History

History
42 lines (30 loc) · 1.94 KB

nodatime.md

File metadata and controls

42 lines (30 loc) · 1.94 KB

Using protobuf-net with Noda Time

Noda Time is "an alternative date and time API for .NET". protobuf-net has always had support for DateTime and TimeSpan (including support for the well-known protobuf types, Timestamp and Duration via CompatibilityLevel), but protobuf-net now offers optional support for Noda Time types.

For example, say we have a type that we want to serialize, which makes use of NodaTime.Instant to represent a point in time (broadly similar to DateTime), or a NodaTime.Duration (broadly similar to TimeSpan); we can include this in a protobuf-net model by:

  • adding a package reference to protobuf-net.NodaTime

  • calling RuntimeTypeModel.Default.AddNodaTime(); as part of application startup

  • annotate the member with protobuf-net attributes as usual, for example:

    [ProtoContract]
    public class MyType {
        // ...
    
        [ProtoMember(42)]
        public Instant ActivationTime {get;set;}
    
        // ...
    }

and: that's it. The library will now handle any of:

  • NodaTime.Duration
  • NodaTime.Instant
  • NodaTime.LocalDate
  • NodaTime.LocalTime
  • NodaTime.IsoDayOfWeek

This is the exact same types that are supported by NodaTime.Serialization.Protobuf (which is used with the Google.Protobuf library), and the two implementations are byte-compatible for simple data exchange.

Additionally, any usage of GetSchema()/GetProto<T>() will give appropriate output indicating the native protobuf types being represented.


Note: protobuf-net.NodaTime makes use of new extension APIs in protobuf-net v3, and therefore will not work with earlier versions of protobuf-net.