Tag: Protobuf

  • Protobuf-net Generics on Unity3D IL2CPP.

    When using Protobuf-net in Unity3D, if your Proto-Contracts include generics you might run into a few issues like Unable to resolve MapDecorator constructor.

    I had to work with the following contract. It was s custom collection class which had a functionality of caching removed elements in the collection.

    [ProtoContract]
    public class CustomCollectionBase<TCollection, TElement, TKey{
    	[ProtoMember(1)]
    	protected TCollection _collection;
    
    	[ProtoMember(2)]
    	protected SortedDictionary<TKey, bool_removed;
    
    	public CustomCollectionBase(TCollection collection)
    	{
    		_collection = collection;
    	}
    }
    
    [ProtoContract]
    public class CustomList<TElement: CustomCollectionBase<List<TElement, TElement, int{
    	public CustomList() : base( new List<TElement())
    	{
    	}
    }
    
    [ProtoContract]
    public class CustomIntDictionary<TElement: CustomCollectionBase<Dictionary<int, 

  • JSON vs Protobuf

    I did a few tests to compare the data payload sizes of different serialization methods on .NET client server communications.

    The test was basically to execute a request/response 20 times.

    Request

    [Serializable]
    [ProtoContract]
    public class GetRatingRequest
    {
            [ProtoMember(1)]
            public int Rating;
            [ProtoMember(2)]
            public int Count;
            [ProtoMember(3)]
            public float A;
            [ProtoMember(4)]
            public float B;
            [ProtoMember(5)]
            public float C;
            [ProtoMember(6)]
            public float D;
            [ProtoMember(7)]
            public float E;
    }

    Response

    [Serializable]
    [ProtoContract]
    public class GetRatingResponse
    {
            [ProtoMember(1)]
            public List<RatingRatings;
    }
    
    [Serializable]
    [ProtoContract]
    public class Rating
    {
            [ProtoMember(1)]
            public bool HighRating { get; set; }
            [ProtoMember(2)]
            public RatingDetail Details { get; set; }