Uh oh!
There was an error while loading. Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork 176
Default collections
As of 0.4, MessagePack for CLI supports 'Default Abstract Collections'. It means that if you use well known abstract collections, MessagePack for CLI built-in (and auto generated) serializers recognize them, handle them correctly. This means you can write following class declaration now:
publicclassFoo{// Although IList<T> is abstract type (interface), you can specify it.publicIList<int>Integers{get;set;}}Serializer library, namely SerializationContext recognizes default abstract collection types and their default implementations, so it simply returns serializers for default implementation classes instead of throwing exception.
'Default collections' refers well known abstract collection types in BCL. Namely, following abstract types are considered as default collection:
| Abstract Default Collection Type | Default Implementation Type | Note |
|---|---|---|
| `System.Collections.Generic.IEnumerable<T>` | `System.Collections.Generic.List<T>` | |
| `System.Collections.Generic.ICollection<T>` | `System.Collections.Generic.List<T>` | |
| `System.Collections.Generic.IList<T>` | `System.Collections.Generic.List<T>` | |
| `System.Collections.Generic.IDictionary<TKey,TValue>` | `System.Collections.Dictionary<TKey,TValue>` | |
| `System.Collections.IEnumerable` | System.Collections.Generic.List<MsgPack.MessagePackObject>` | |
| `System.Collections.ICollection` | `System.Collections.List<MsgPack.MessagePackObject>` | |
| `System.Collections.IList` | `System.Collections.List<MsgPack.MessagePackObject>` | |
| `System.Collections.IDictionary` | `MsgPack.MessagePackObjectDictionary` | |
| `System.Collections.Generic.ISet<T>` | `System.Collections.Generic.HashSet<T>` | .NET 4.0 and greater. |
| `System.Collections.Generic.IReadOnlyCollection<T>` | `System.Collections.Generic.List<T>` | .NET 4.5 and greater |
| `System.Collections.Generic.IReadOnlyList<T>` | `System.Collections.Generic.List<T>` | .NET 4.5 and greater |
| `System.Collections.Generic.IReadOnlyDictionary<TKey,TValue>` | `System.Collections.Generic.Dictionary<TKey,TValue>` | .NET 4.5 and greater |
You can override default implementation classes by overriding default collcetion types as following:
varcontext=newSerializationContext();// You can override all closed generic types by specifying generic type definition.context.DefaultCollectionTypes.Register(typeof(IList<>),typeof(Collection<>));// You also able to override specific closed generic type by specifying closed generic type.// For following example, other closed types including IList<string> etc. are not affected.context.DefaultCollectionTypes.Register(typeof(IList<int>),typeof(Collection<int>));