/// <summary> /// Creates a new <see cref="SerializationContext"/> which is configured as compatible for the specified version. /// </summary> /// <param name="compatibilityLevel">A <see cref="SerializationCompatibilityLevel"/> to specify compatibility level.</param> /// <returns> /// A new <see cref="SerializationContext"/> which is configured as compatible for the specified version. /// </returns> /// <remarks> /// <para> /// There are breaking changes of <see cref="SerializationContext"/> properties to improve API usability and to prevent accidental failure. /// This method returns a <see cref="SerializationContext"/> which configured as classic style settings as follows: /// </para> /// <list type="table"> /// <listheader> /// <term></term> /// <description>Latest (as of 0.6)</description> /// <description>Version0_9 (as of 0.6)</description> /// <description>Version0_5 (formally, "classic", before 0.6)</description> /// </listheader> /// <item> /// <term><see cref="DateTime"/> and <see cref="DateTimeOffset"/> value</term> /// <description><see cref="Timestamp"/> value.</description> /// <description>Native representation (100-nano ticks, preserving <see cref="DateTimeKind"/>.)</description> /// <description>UTC, milliseconds Unix epoc.</description> /// </item> /// <item> /// <term>Usage of <c>ext</c> types</term> /// <description>Allowed</description> /// <description>Allowed</description> /// <description>Prohibited</description> /// </item> /// <item> /// <term>Binary (such as <c>Byte[]</c>) representation</term> /// <description>Bin types</description> /// <description>Bin types</description> /// <description>Raw types</description> /// </item> /// <item> /// <term>Strings which lengthes are between 17 to 255</term> /// <description>Str8 type</description> /// <description>Str8 types</description> /// <description>Raw16 type</description> /// </item> /// </list> /// <para> /// In short, <see cref="SerializationCompatibilityLevel.Version0_5"/> prohibits deserialization error in legacy implementation /// which do not recognize ext types, str8 type, and/or bin types. /// <see cref="SerializationCompatibilityLevel.Version0_9"/> prohibits only <see cref="Timestamp"/> serialization for datetime /// to keep compatibility for 0.9.x instead of maximize datetime serialization for modern implementations which uses msgpack timestamp type, /// which is composite ext type, nano-second precision Unix epoc time. /// </para> /// </remarks> public static SerializationContext CreateClassicContext( SerializationCompatibilityLevel compatibilityLevel ) { switch ( compatibilityLevel ) { case SerializationCompatibilityLevel.Version0_5: { return new SerializationContext( PackerCompatibilityOptions.Classic ) { DefaultDateTimeConversionMethod = DateTimeConversionMethod.UnixEpoc }; } case SerializationCompatibilityLevel.Version0_9: { return new SerializationContext( PackerCompatibilityOptions.None ) { DefaultDateTimeConversionMethod = DateTimeConversionMethod.Native }; } case SerializationCompatibilityLevel.Latest: { return new SerializationContext( PackerCompatibilityOptions.None ); } default: { throw new ArgumentOutOfRangeException( "Unknown SerializationCompatibilityLevel value." ); } } }
/// <summary> /// Configures <see cref="Default"/> as new classic <see cref="SerializationContext"/> instance as compatible for sepcified version. /// </summary> /// <param name="compatibilityLevel">A <see cref="SerializationCompatibilityLevel"/> to specify compatibility level.</param> /// <returns>The previously set context as <see cref="Default"/>.</returns> /// <seealso cref="CreateClassicContext(SerializationCompatibilityLevel)"/> public static SerializationContext ConfigureClassic(SerializationCompatibilityLevel compatibilityLevel) { #if !UNITY return Interlocked.Exchange( ref _default, CreateClassicContext( compatibilityLevel) ); #else lock ( DefaultContextSyncRoot ) { var old = _default; _default = CreateClassicContext(); return old; } #endif // !UNITY }
/// <summary> /// Creates new <see cref="SerializationContext"/> for generation based testing. /// </summary> /// <param name="method"><see cref="SerializationMethod"/>.</param> /// <param name="compatibilityLevel"><see cref="SerializationCompatibilityLevel"/> for built-in serializers.</param> /// <returns>A new <see cref="SerializationContext"/> for generation based testing.</returns> public static SerializationContext CreateContext(SerializationMethod method, SerializationCompatibilityLevel compatibilityLevel) { var context = SerializationContext.CreateClassicContext(compatibilityLevel); context.SerializationMethod = method; foreach (var entry in _serializers) { context.Serializers.Register(entry.Key, entry.Value, null, null, SerializerRegistrationOptions.None); } #if !AOT context.SerializerOptions.DisableRuntimeCodeGeneration = true; #endif // !AOT return(context); }