Click here to Skip to main content
15,896,118 members
Articles / Programming Languages / C#

A Fast/Compact Serialization Framework

Rate me:
Please Sign up or sign in to vote.
4.85/5 (37 votes)
13 Oct 2010GPL35 min read 284.3K   1.2K   175  
A framework for object serializiation/deserialization that is many times faster and yields a compact output.
/*

OpenNxSerialization Framework
Copyright (C) 2006 - 2007 "NeXtreme Innovations"
[The Next Xtreme Innovations]

This program is free software, distributed under the terms of
the GNU General Public License Version 2. See the "License.txt" file
at the top of the source tree.

*/
using System;
using System.Collections;
using System.Reflection;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters;
using System.Runtime.Serialization.Formatters.Binary;

using NeXtreme.OpenNxSerialization.IO;
using NeXtreme.OpenNxSerialization.Formatters;

namespace NeXtreme.OpenNxSerialization.Surrogates
{
    #region /       Default surrogates       /

    /// <summary>
    /// Surrogate for null values. 
    /// </summary>
    sealed class NxNullSerializationSurrogate : NxSerializationSurrogate, INxBuiltinSerializationSurrogate
    {
        public NxNullSerializationSurrogate() : base(typeof(NxNullSerializationSurrogate)) { }
    }

    /// <summary>
    /// Surrogate for <see cref="System.Object"/> objects. Also serves the
    /// purpose of default surrogate. It uses .NET native serialization
    /// </summary>
    sealed class NxObjectSerializationSurrogate : NxSerializationSurrogate, INxBuiltinSerializationSurrogate
    {
        static BinaryFormatter formatter = new BinaryFormatter();

        public NxObjectSerializationSurrogate(Type t) : base(t) { }

        /// <summary>
        /// Uses a <see cref="BinaryFormatter"/> to read an object of 
        /// type <see cref="NxSerializationSurrogate.ActualType"/> from the underlying stream.
        /// </summary>
        /// <param name="reader">stream reader</param>
        /// <returns>object read from the stream reader</returns>
        public override object Read(NxBinaryReader reader)
        {
            int cookie = reader.ReadInt32();
            object custom = reader.Context.GetObject(cookie);
            if (custom == null)
            {
                custom = formatter.Deserialize(reader.BaseReader.BaseStream);
                reader.Context.RememberForRead(custom);
            }
            return custom;
        }

        /// <summary>
        /// Uses a <see cref="BinaryFormatter"/> to write an object of 
        /// type <see cref="NxSerializationSurrogate.ActualType"/> to the underlying stream
        /// </summary>
        /// <param name="writer">stream writer</param>
        /// <param name="graph">object to be written to the stream reader</param>
        public override void Write(NxBinaryWriter writer, object graph)
        {
            int cookie = writer.Context.GetCookie(graph);
            if (cookie != NxSerializationContext.INVALID_COOKIE)
            {
                writer.Write(cookie);
                return;
            }

            cookie = writer.Context.RememberForWrite(graph);
            writer.Write(cookie);
            formatter.Serialize(writer.BaseWriter.BaseStream, graph);
        }
    }

    /// <summary>
    /// Surrogate for <see cref="System.Object"/>[] type.
    /// </summary>
    sealed class NxObjectArraySerializationSurrogate : NxContextSensitiveSerializationSurrogate, INxBuiltinSerializationSurrogate
    {
        public NxObjectArraySerializationSurrogate() : base(typeof(object[])) { }

        public override object Instantiate(NxBinaryReader reader)
        {
            int length = reader.ReadInt32();
            return new object[length];
        }

        public override object ReadDirect(NxBinaryReader reader, object graph)
        {
            object[] array = (object[])graph;
            for (int i = 0; i < array.Length; i++)
                array[i] = reader.ReadObject();
            return array;
        }

        public override void WriteDirect(NxBinaryWriter writer, object graph)
        {
            object[] array = (object[])graph;
            writer.Write(array.Length);
            for (int i = 0; i < array.Length; i++)
                writer.WriteObject(array[i]);
        }
    }

    /// <summary>
    /// Surrogate for <see cref="System.Enum"/> derived types.
    /// </summary>
    sealed class NxEnumSerializationSurrogate : NxSerializationSurrogate, INxBuiltinSerializationSurrogate
    {
        public NxEnumSerializationSurrogate(Type enm) : base(enm) { }
        public override object Read(NxBinaryReader reader)
        {
            // Find an appropriate surrogate by handle
            short handle = reader.ReadInt16();
            INxSerializationSurrogate typeSurr = reader.Context.SurrogateSelector.GetSurrogateForTypeHandle(handle);
            return Enum.ToObject(ActualType, typeSurr.Read(reader));
        }
        public override void Write(NxBinaryWriter writer, object graph)
        {
            Type enumType = Enum.GetUnderlyingType(ActualType);
            INxSerializationSurrogate typeSurr = writer.Context.SurrogateSelector.GetSurrogateForType(enumType);
            writer.Write(typeSurr.TypeHandle);
            typeSurr.Write(writer, graph);
        }
    }

    #endregion

    #region /       .NET Primitive Types' surrogates       /

    /// <summary>
    /// Surrogate for <see cref="System.Boolean"/> type.
    /// </summary>
    sealed class NxBooleanSerializationSurrogate : NxSerializationSurrogate, INxBuiltinSerializationSurrogate
    {
        public NxBooleanSerializationSurrogate() : base(typeof(Boolean)) { }
        public override object Read(NxBinaryReader reader) { return reader.ReadBoolean(); }
        public override void Write(NxBinaryWriter writer, object graph) { writer.Write((Boolean)graph); }
    }

    /// <summary>
    /// Surrogate for <see cref="System.Boolean"/>[] type.
    /// </summary>
    sealed class NxBooleanArraySerializationSurrogate : NxContextSensitiveSerializationSurrogate, INxBuiltinSerializationSurrogate
    {
        public NxBooleanArraySerializationSurrogate() : base(typeof(Boolean[])) { }

        public override object Instantiate(NxBinaryReader reader)
        {
            int length = reader.ReadInt32();
            return new Boolean[length];
        }

        public override object ReadDirect(NxBinaryReader reader, object graph)
        {
            Boolean[] array = (Boolean[])graph;
            for (int i = 0; i < array.Length; i++) array[i] = reader.ReadBoolean();
            return array;
        }

        public override void WriteDirect(NxBinaryWriter writer, object graph)
        {
            Boolean[] array = (Boolean[])graph;
            writer.Write(array.Length);
            for (int i = 0; i < array.Length; i++)
                writer.Write(array[i]);
        }
    }

    /// <summary>
    /// Surrogate for <see cref="System.Byte"/> type.
    /// </summary>
    sealed class NxByteSerializationSurrogate : NxSerializationSurrogate, INxBuiltinSerializationSurrogate
    {
        public NxByteSerializationSurrogate() : base(typeof(Byte)) { }
        public override object Read(NxBinaryReader reader) { return reader.ReadByte(); }
        public override void Write(NxBinaryWriter writer, object graph) { writer.Write((Byte)graph); }
    }

    /// <summary>
    /// Surrogate for <see cref="System.Byte"/>[] type.
    /// </summary>
    sealed class NxByteArraySerializationSurrogate : NxContextSensitiveSerializationSurrogate, INxBuiltinSerializationSurrogate
    {
        public NxByteArraySerializationSurrogate() : base(typeof(Byte[])) { }

        public override object Instantiate(NxBinaryReader reader)
        {
            int length = reader.ReadInt32();
            return reader.ReadBytes(length);
        }

        public override object ReadDirect(NxBinaryReader reader, object graph)
        {
            return graph;
        }

        public override void WriteDirect(NxBinaryWriter writer, object graph)
        {
            Byte[] array = (Byte[])graph;
            writer.Write(array.Length);
            writer.Write(array);
        }
    }

    /// <summary>
    /// Surrogate for <see cref="System.Char"/> type.
    /// </summary>
    sealed class NxCharSerializationSurrogate : NxSerializationSurrogate, INxBuiltinSerializationSurrogate
    {
        public NxCharSerializationSurrogate() : base(typeof(Char)) { }
        public override object Read(NxBinaryReader reader) { return reader.ReadChar(); }
        public override void Write(NxBinaryWriter writer, object graph) { writer.Write((Char)graph); }
    }

    /// <summary>
    /// Surrogate for <see cref="System.Char"/>[] type.
    /// </summary>
    sealed class NxCharArraySerializationSurrogate : NxContextSensitiveSerializationSurrogate, INxBuiltinSerializationSurrogate
    {
        public NxCharArraySerializationSurrogate() : base(typeof(Char[])) { }

        public override object Instantiate(NxBinaryReader reader)
        {
            int length = reader.ReadInt32();
            return reader.ReadChars(length);
        }

        public override object ReadDirect(NxBinaryReader reader, object graph)
        {
            return graph;
        }

        public override void WriteDirect(NxBinaryWriter writer, object graph)
        {
            Char[] array = (Char[])graph;
            writer.Write(array.Length);
            writer.Write(array);
        }
    }

    /// <summary>
    /// Surrogate for <see cref="System.Single"/> type.
    /// </summary>
    sealed class NxSingleSerializationSurrogate : NxSerializationSurrogate, INxBuiltinSerializationSurrogate
    {
        public NxSingleSerializationSurrogate() : base(typeof(Single)) { }
        public override object Read(NxBinaryReader reader) { return reader.ReadSingle(); }
        public override void Write(NxBinaryWriter writer, object graph) { writer.Write((Single)graph); }
    }

    /// <summary>
    /// Surrogate for <see cref="System.Single"/>[] type.
    /// </summary>
    sealed class NxSingleArraySerializationSurrogate : NxContextSensitiveSerializationSurrogate, INxBuiltinSerializationSurrogate
    {
        public NxSingleArraySerializationSurrogate() : base(typeof(Single[])) { }

        public override object Instantiate(NxBinaryReader reader)
        {
            int length = reader.ReadInt32();
            return new Single[length];
        }

        public override object ReadDirect(NxBinaryReader reader, object graph)
        {
            Single[] array = (Single[])graph;
            for (int i = 0; i < array.Length; i++)
                array[i] = reader.ReadSingle();
            return array;
        }

        public override void WriteDirect(NxBinaryWriter writer, object graph)
        {
            Single[] array = (Single[])graph;
            writer.Write(array.Length);
            for (int i = 0; i < array.Length; i++)
                writer.Write(array[i]);
        }
    }

    /// <summary>
    /// Surrogate for <see cref="System.Double"/> type.
    /// </summary>
    sealed class NxDoubleSerializationSurrogate : NxSerializationSurrogate, INxBuiltinSerializationSurrogate
    {
        public NxDoubleSerializationSurrogate() : base(typeof(Double)) { }
        public override object Read(NxBinaryReader reader) { return reader.ReadDouble(); }
        public override void Write(NxBinaryWriter writer, object graph) { writer.Write((Double)graph); }
    }

    /// <summary>
    /// Surrogate for <see cref="System.Double"/>[] type.
    /// </summary>
    sealed class NxDoubleArraySerializationSurrogate : NxContextSensitiveSerializationSurrogate, INxBuiltinSerializationSurrogate
    {
        public NxDoubleArraySerializationSurrogate() : base(typeof(Double[])) { }

        public override object Instantiate(NxBinaryReader reader)
        {
            int length = reader.ReadInt32();
            return new Double[length];
        }

        public override object ReadDirect(NxBinaryReader reader, object graph)
        {
            Double[] array = (Double[])graph;
            for (int i = 0; i < array.Length; i++)
                array[i] = reader.ReadDouble();
            return array;
        }

        public override void WriteDirect(NxBinaryWriter writer, object graph)
        {
            Double[] array = (Double[])graph;
            writer.Write(array.Length);
            for (int i = 0; i < array.Length; i++)
                writer.Write(array[i]);
        }
    }

    /// <summary>
    /// Surrogate for <see cref="System.Decimal"/> type.
    /// </summary>
    sealed class NxDecimalSerializationSurrogate : NxSerializationSurrogate, INxBuiltinSerializationSurrogate
    {
        public NxDecimalSerializationSurrogate() : base(typeof(Decimal)) { }
        public override object Read(NxBinaryReader reader) { return reader.ReadDecimal(); }
        public override void Write(NxBinaryWriter writer, object graph) { writer.Write((Decimal)graph); }
    }

    /// <summary>
    /// Surrogate for <see cref="System.Decimal"/>[] type.
    /// </summary>
    sealed class NxDecimalArraySerializationSurrogate : NxContextSensitiveSerializationSurrogate, INxBuiltinSerializationSurrogate
    {
        public NxDecimalArraySerializationSurrogate() : base(typeof(Decimal)) { }

        public override object Instantiate(NxBinaryReader reader)
        {
            int length = reader.ReadInt32();
            return new Decimal[length];
        }

        public override object ReadDirect(NxBinaryReader reader, object graph)
        {
            Decimal[] array = (Decimal[])graph;
            for (int i = 0; i < array.Length; i++)
                array[i] = reader.ReadDecimal();
            return array;
        }

        public override void WriteDirect(NxBinaryWriter writer, object graph)
        {
            Decimal[] array = (Decimal[])graph;
            writer.Write(array.Length);
            for (int i = 0; i < array.Length; i++)
                writer.Write(array[i]);
        }
    }

    /// <summary>
    /// Surrogate for <see cref="System.Int16"/> type.
    /// </summary>
    sealed class NxInt16SerializationSurrogate : NxSerializationSurrogate, INxBuiltinSerializationSurrogate
    {
        public NxInt16SerializationSurrogate() : base(typeof(Int16)) { }
        public override object Read(NxBinaryReader reader) { return reader.ReadInt16(); }
        public override void Write(NxBinaryWriter writer, object graph) { writer.Write((Int16)graph); }
    }

    /// <summary>
    /// Surrogate for <see cref="System.Int16"/>[] type.
    /// </summary>
    sealed class NxInt16ArraySerializationSurrogate : NxContextSensitiveSerializationSurrogate, INxBuiltinSerializationSurrogate
    {
        public NxInt16ArraySerializationSurrogate() : base(typeof(Int16[])) { }

        public override object Instantiate(NxBinaryReader reader)
        {
            int length = reader.ReadInt32();
            return new Int16[length];
        }

        public override object ReadDirect(NxBinaryReader reader, object graph)
        {
            Int16[] array = (Int16[])graph;
            for (int i = 0; i < array.Length; i++)
                array[i] = reader.ReadInt16();
            return array;
        }

        public override void WriteDirect(NxBinaryWriter writer, object graph)
        {
            Int16[] array = (Int16[])graph;
            writer.Write(array.Length);
            for (int i = 0; i < array.Length; i++)
                writer.Write(array[i]);
        }
    }

    /// <summary>
    /// Surrogate for <see cref="System.Int32"/> type.
    /// </summary>
    sealed class NxInt32SerializationSurrogate : NxSerializationSurrogate, INxBuiltinSerializationSurrogate
    {
        public NxInt32SerializationSurrogate() : base(typeof(Int32)) { }
        public override object Read(NxBinaryReader reader) { return reader.ReadInt32(); }
        public override void Write(NxBinaryWriter writer, object graph) { writer.Write((int)graph); }
    }

    /// <summary>
    /// Surrogate for <see cref="System.Int32"/>[] type.
    /// </summary>
    sealed class NxInt32ArraySerializationSurrogate : NxContextSensitiveSerializationSurrogate, INxBuiltinSerializationSurrogate
    {
        public NxInt32ArraySerializationSurrogate() : base(typeof(Int32[])) { }

        public override object Instantiate(NxBinaryReader reader)
        {
            int length = reader.ReadInt32();
            return new Int32[length];
        }

        public override object ReadDirect(NxBinaryReader reader, object graph)
        {
            Int32[] array = (Int32[])graph;
            for (int i = 0; i < array.Length; i++)
                array[i] = reader.ReadInt32();
            return array;
        }

        public override void WriteDirect(NxBinaryWriter writer, object graph)
        {
            Int32[] array = (Int32[])graph;
            writer.Write(array.Length);
            for (int i = 0; i < array.Length; i++)
                writer.Write(array[i]);
        }
    }

    /// <summary>
    /// Surrogate for <see cref="System.Int64"/> type.
    /// </summary>
    sealed class NxInt64SerializationSurrogate : NxSerializationSurrogate, INxBuiltinSerializationSurrogate
    {
        public NxInt64SerializationSurrogate() : base(typeof(Int64)) { }
        public override object Read(NxBinaryReader reader) { return reader.ReadInt64(); }
        public override void Write(NxBinaryWriter writer, object graph) { writer.Write((Int64)graph); }
    }

    /// <summary>
    /// Surrogate for <see cref="System.Int64"/>[] type.
    /// </summary>
    sealed class NxInt64ArraySerializationSurrogate : NxContextSensitiveSerializationSurrogate, INxBuiltinSerializationSurrogate
    {
        public NxInt64ArraySerializationSurrogate() : base(typeof(Int64)) { }

        public override object Instantiate(NxBinaryReader reader)
        {
            int length = reader.ReadInt32();
            return new Int64[length];
        }

        public override object ReadDirect(NxBinaryReader reader, object graph)
        {
            Int64[] array = (Int64[])graph;
            for (int i = 0; i < array.Length; i++)
                array[i] = reader.ReadInt64();
            return array;
        }

        public override void WriteDirect(NxBinaryWriter writer, object graph)
        {
            Int64[] array = (Int64[])graph;
            writer.Write(array.Length);
            for (int i = 0; i < array.Length; i++)
                writer.Write(array[i]);
        }
    }

    /// <summary>
    /// Surrogate for <see cref="System.DateTime"/> type.
    /// </summary>
    sealed class NxDateTimeSerializationSurrogate : NxSerializationSurrogate, INxBuiltinSerializationSurrogate
    {
        public NxDateTimeSerializationSurrogate() : base(typeof(DateTime)) { }
        public override object Read(NxBinaryReader reader) { return reader.ReadDateTime(); }
        public override void Write(NxBinaryWriter writer, object graph) { writer.Write((DateTime)graph); }
    }

    /// <summary>
    /// Surrogate for <see cref="System.DateTime"/>[] type.
    /// </summary>
    sealed class NxDateTimeArraySerializationSurrogate : NxContextSensitiveSerializationSurrogate, INxBuiltinSerializationSurrogate
    {
        public NxDateTimeArraySerializationSurrogate() : base(typeof(DateTime[])) { }

        public override object Instantiate(NxBinaryReader reader)
        {
            int length = reader.ReadInt32();
            return new DateTime[length];
        }

        public override object ReadDirect(NxBinaryReader reader, object graph)
        {
            DateTime[] array = (DateTime[])graph;
            for (int i = 0; i < array.Length; i++)
                array[i] = reader.ReadDateTime();
            return array;
        }

        public override void WriteDirect(NxBinaryWriter writer, object graph)
        {
            DateTime[] array = (DateTime[])graph;
            writer.Write(array.Length);
            for (int i = 0; i < array.Length; i++)
                writer.Write(array[i]);
        }
    }

    /// <summary>
    /// Surrogate for <see cref="System.String"/> type.
    /// </summary>
    sealed class NxStringSerializationSurrogate : NxSerializationSurrogate, INxBuiltinSerializationSurrogate
    {
        public NxStringSerializationSurrogate() : base(typeof(String)) { }
        public override object Read(NxBinaryReader reader) { return reader.ReadString(); }
        public override void Write(NxBinaryWriter writer, object graph) { writer.Write((string)graph); }
    }

    /// <summary>
    /// Surrogate for <see cref="System.String"/>[] type.
    /// </summary>
    sealed class NxStringArraySerializationSurrogate : NxContextSensitiveSerializationSurrogate, INxBuiltinSerializationSurrogate
    {
        public NxStringArraySerializationSurrogate() : base(typeof(String[])) { }

        public override object Instantiate(NxBinaryReader reader)
        {
            int length = reader.ReadInt32();
            return new String[length];
        }

        public override object ReadDirect(NxBinaryReader reader, object graph)
        {
            String[] array = (String[])graph;
            for (int i = 0; i < array.Length; i++)
                array[i] = reader.ReadString();
            return array;
        }

        public override void WriteDirect(NxBinaryWriter writer, object graph)
        {
            String[] array = (String[])graph;
            writer.Write(array.Length);
            for (int i = 0; i < array.Length; i++)
                writer.Write(array[i]);
        }
    }

    /// <summary>
    /// Surrogate for <see cref="System.Guid"/> type.
    /// </summary>
    sealed class NxGuidSerializationSurrogate : NxSerializationSurrogate, INxBuiltinSerializationSurrogate
    {
        public NxGuidSerializationSurrogate() : base(typeof(Guid)) { }
        public override object Read(NxBinaryReader reader) { return reader.ReadGuid(); }
        public override void Write(NxBinaryWriter writer, object graph) { writer.Write((Guid)graph); }
    }

    /// <summary>
    /// Surrogate for <see cref="System.Guid"/>[] type.
    /// </summary>
    sealed class NxGuidArraySerializationSurrogate : NxContextSensitiveSerializationSurrogate, INxBuiltinSerializationSurrogate
    {
        public NxGuidArraySerializationSurrogate() : base(typeof(Guid[])) { }

        public override object Instantiate(NxBinaryReader reader)
        {
            int length = reader.ReadInt32();
            return new Guid[length];
        }

        public override object ReadDirect(NxBinaryReader reader, object graph)
        {
            Guid[] array = (Guid[])graph;
            for (int i = 0; i < array.Length; i++)
                array[i] = reader.ReadGuid();
            return array;
        }

        public override void WriteDirect(NxBinaryWriter writer, object graph)
        {
            Guid[] array = (Guid[])graph;
            writer.Write(array.Length);
            for (int i = 0; i < array.Length; i++)
                writer.Write(array[i]);
        }
    }

    /// <summary>
    /// Surrogate for <see cref="System.SByte"/> type.
    /// </summary>
    sealed class NxSByteSerializationSurrogate : NxSerializationSurrogate, INxBuiltinSerializationSurrogate
    {
        public NxSByteSerializationSurrogate() : base(typeof(SByte)) { }
        public override object Read(NxBinaryReader reader) { return reader.ReadSByte(); }
        public override void Write(NxBinaryWriter writer, object graph) { writer.Write((SByte)graph); }
    }

    /// <summary>
    /// Surrogate for <see cref="System.SByte"/>[] type.
    /// </summary>
    sealed class NxSByteArraySerializationSurrogate : NxContextSensitiveSerializationSurrogate, INxBuiltinSerializationSurrogate
    {
        public NxSByteArraySerializationSurrogate() : base(typeof(SByte[])) { }

        public override object Instantiate(NxBinaryReader reader)
        {
            int length = reader.ReadInt32();
            return new SByte[length];
        }

        public override object ReadDirect(NxBinaryReader reader, object graph)
        {
            SByte[] array = (SByte[])graph;
            for (int i = 0; i < array.Length; i++)
                array[i] = reader.ReadSByte();
            return array;
        }

        public override void WriteDirect(NxBinaryWriter writer, object graph)
        {
            SByte[] array = (SByte[])graph;
            writer.Write(array.Length);
            for (int i = 0; i < array.Length; i++)
                writer.Write(array[i]);
        }
    }

    /// <summary>
    /// Surrogate for <see cref="System.UInt16"/> type.
    /// </summary>
    sealed class NxUInt16SerializationSurrogate : NxSerializationSurrogate, INxBuiltinSerializationSurrogate
    {
        public NxUInt16SerializationSurrogate() : base(typeof(UInt16)) { }
        public override object Read(NxBinaryReader reader) { return reader.ReadUInt16(); }
        public override void Write(NxBinaryWriter writer, object graph) { writer.Write((UInt16)graph); }
    }

    /// <summary>
    /// Surrogate for <see cref="System.UInt16"/>[] type.
    /// </summary>
    sealed class NxUInt16ArraySerializationSurrogate : NxContextSensitiveSerializationSurrogate, INxBuiltinSerializationSurrogate
    {
        public NxUInt16ArraySerializationSurrogate() : base(typeof(UInt16[])) { }

        public override object Instantiate(NxBinaryReader reader)
        {
            int length = reader.ReadInt32();
            return new UInt16[length];
        }

        public override object ReadDirect(NxBinaryReader reader, object graph)
        {
            UInt16[] array = (UInt16[])graph;
            for (int i = 0; i < array.Length; i++)
                array[i] = reader.ReadUInt16();
            return array;
        }

        public override void WriteDirect(NxBinaryWriter writer, object graph)
        {
            UInt16[] array = (UInt16[])graph;
            writer.Write(array.Length);
            for (int i = 0; i < array.Length; i++)
                writer.Write(array[i]);
        }
    }

    /// <summary>
    /// Surrogate for <see cref="System.UInt32"/> type.
    /// </summary>
    sealed class NxUInt32SerializationSurrogate : NxSerializationSurrogate, INxBuiltinSerializationSurrogate
    {
        public NxUInt32SerializationSurrogate() : base(typeof(UInt32)) { }
        public override object Read(NxBinaryReader reader) { return reader.ReadUInt32(); }
        public override void Write(NxBinaryWriter writer, object graph) { writer.Write((UInt32)graph); }
    }

    /// <summary>
    /// Surrogate for <see cref="System.UInt32"/>[] type.
    /// </summary>
    sealed class NxUInt32ArraySerializationSurrogate : NxContextSensitiveSerializationSurrogate, INxBuiltinSerializationSurrogate
    {
        public NxUInt32ArraySerializationSurrogate() : base(typeof(UInt32[])) { }

        public override object Instantiate(NxBinaryReader reader)
        {
            int length = reader.ReadInt32();
            return new UInt32[length];
        }

        public override object ReadDirect(NxBinaryReader reader, object graph)
        {
            UInt32[] array = (UInt32[])graph;
            for (int i = 0; i < array.Length; i++)
                array[i] = reader.ReadUInt32();
            return array;
        }

        public override void WriteDirect(NxBinaryWriter writer, object graph)
        {
            UInt32[] array = (UInt32[])graph;
            writer.Write(array.Length);
            for (int i = 0; i < array.Length; i++)
                writer.Write(array[i]);
        }
    }

    /// <summary>
    /// Surrogate for <see cref="System.UInt64"/> type.
    /// </summary>
    sealed class NxUInt64SerializationSurrogate : NxSerializationSurrogate, INxBuiltinSerializationSurrogate
    {
        public NxUInt64SerializationSurrogate() : base(typeof(UInt64)) { }
        public override object Read(NxBinaryReader reader) { return reader.ReadUInt64(); }
        public override void Write(NxBinaryWriter writer, object graph) { writer.Write((UInt64)graph); }
    }

    /// <summary>
    /// Surrogate for <see cref="System.UInt64"/>[] type.
    /// </summary>
    sealed class NxUInt64ArraySerializationSurrogate : NxContextSensitiveSerializationSurrogate, INxBuiltinSerializationSurrogate
    {
        public NxUInt64ArraySerializationSurrogate() : base(typeof(UInt64[])) { }

        public override object Instantiate(NxBinaryReader reader)
        {
            int length = reader.ReadInt32();
            return new UInt64[length];
        }

        public override object ReadDirect(NxBinaryReader reader, object graph)
        {
            UInt64[] array = (UInt64[])graph;
            for (int i = 0; i < array.Length; i++)
                array[i] = reader.ReadUInt64();
            return array;
        }

        public override void WriteDirect(NxBinaryWriter writer, object graph)
        {
            UInt64[] array = (UInt64[])graph;
            writer.Write(array.Length);
            for (int i = 0; i < array.Length; i++)
                writer.Write(array[i]);
        }
    }

    #endregion

    #region /       Generic surrogates for containers      /

    /// <summary>
    /// Surrogate for generic <see cref="System.Array"/> types.
    /// </summary>
    sealed class NxArraySerializationSurrogate : NxContextSensitiveSerializationSurrogate, INxBuiltinSerializationSurrogate
    {
        public NxArraySerializationSurrogate(Type t) : base(t) { }

        public override object Instantiate(NxBinaryReader reader)
        {
            int length = reader.ReadInt32();
            return Array.CreateInstance(ActualType.GetElementType(), length);
        }

        public override object ReadDirect(NxBinaryReader reader, object graph)
        {
            Array array = (Array)graph;
            for (int i = 0; i < array.Length; i++)
                array.SetValue(reader.ReadObject(), i);
            return array;
        }

        public override void WriteDirect(NxBinaryWriter writer, object graph)
        {
            Array array = (Array)graph;
            writer.Write(array.Length);
            for (int i = 0; i < array.Length; i++)
                writer.WriteObject(array.GetValue(i));
        }
    }

    /// <summary>
    /// Surrogate for types that inherit from <see cref="System.Collections.IList"/>.
    /// </summary>
    sealed class NxIListSerializationSurrogate : NxContextSensitiveSerializationSurrogate, INxBuiltinSerializationSurrogate
    {
        public NxIListSerializationSurrogate(Type t) : base(t) { }

        public override object ReadDirect(NxBinaryReader reader, object graph)
        {
            int length = reader.ReadInt32();
            IList list = (IList)graph;
            for (int i = 0; i < length; i++)
                list.Add(reader.ReadObject());
            return list;
        }

        public override void WriteDirect(NxBinaryWriter writer, object graph)
        {
            IList list = (IList)graph;
            writer.Write(list.Count);
            for (int i = 0; i < list.Count; i++)
                writer.WriteObject(list[i]);
        }
    }

    /// <summary>
    /// Surrogate for types that inherit from <see cref="System.Collections.IDictionary"/>.
    /// </summary>
    sealed class NxIDictionarySerializationSurrogate : NxContextSensitiveSerializationSurrogate, INxBuiltinSerializationSurrogate
    {
        public NxIDictionarySerializationSurrogate(Type t) : base(t) { }

        public override object ReadDirect(NxBinaryReader reader, object graph)
        {
            int length = reader.ReadInt32();
            IDictionary dict = (IDictionary)graph;
            for (int i = 0; i < length; i++)
            {
                object key = reader.ReadObject();
                object value = reader.ReadObject();
                dict.Add(key, value);
            }
            return dict;
        }

        public override void WriteDirect(NxBinaryWriter writer, object graph)
        {
            IDictionary dict = (IDictionary)graph;
            writer.Write(dict.Count);
            for (IDictionaryEnumerator i = dict.GetEnumerator(); i.MoveNext(); )
            {
                writer.WriteObject(i.Key);
                writer.WriteObject(i.Value);
            }
        }
    }

    #endregion

    #region /       System.Nullable<T> surrogates      /

    /// <summary>
    /// Surrogate for <see cref="System.Nullable"/> type.
    /// </summary>
    sealed class NxNullableArraySerializationSurrogate<T> : NxSerializationSurrogate, INxBuiltinSerializationSurrogate
           where T : struct
    {
        public NxNullableArraySerializationSurrogate() : base(typeof(T?[])) { }

        public override object Read(NxBinaryReader reader)
        {
            // read type handle
            short handle = reader.ReadInt16();
            int length = reader.ReadInt32();

            // Find an appropriate surrogate by handle
            INxSerializationSurrogate typeSurr = reader.Context.SurrogateSelector.GetSurrogateForTypeHandle(handle);

            Nullable<T>[] array = new Nullable<T>[length];
            while (true)
            {
                int index = reader.ReadInt32();
                if (index < 0) break;

                array[index] = (T)typeSurr.Read(reader);
            }
            return array;
        }

        public override void Write(NxBinaryWriter writer, object graph)
        {
            // Find an appropriate surrogate for the object
            INxSerializationSurrogate typeSurr = writer.Context.SurrogateSelector.GetSurrogateForType(typeof(T));

            Nullable<T>[] array = (Nullable<T>[])graph;

            // write type handle
            writer.Write(typeSurr.TypeHandle);
            writer.Write(array.Length);
            for (int i = 0; i < array.Length; i++)
            {
                if (array[i].HasValue)
                {
                    writer.Write(i);
                    typeSurr.Write(writer, array[i].Value);
                }
            }
            writer.Write(-1);
        }

        //public override object Read(NxBinaryReader reader)
        //{
        //    // read type handle
        //    short handle = reader.ReadInt16();
        //    int length = reader.ReadInt32();

        //    // Find an appropriate surrogate by handle
        //    INxSerializationSurrogate typeSurr = NxTypeSurrogateSelector.GetSurrogateForTypeHandle(handle);

        //    T?[] array = new T?[length];
        //    for (int i = 0; i < length;)
        //    {
        //        bool dataRun = reader.ReadBoolean();
        //        int runLength = reader.ReadInt32();
        //        if (dataRun)
        //        {
        //            for (int k = 0; k < runLength; k++)
        //                array[i + k] = (T?)typeSurr.Read(reader);
        //        }
        //        i += runLength;
        //    }
        //    return array;
        //}

        //public override void Write(NxBinaryWriter writer, object graph)
        //{
        //    // Find an appropriate surrogate for the object
        //    INxSerializationSurrogate typeSurr = NxTypeSurrogateSelector.GetSurrogateForType(typeof(T));

        //    T?[] array = (T?[])graph;

        //    // write type handle
        //    writer.Write(typeSurr.TypeHandle);
        //    writer.Write(array.Length);

        //    bool dataRun = array[0].HasValue;
        //    for (int i = 0; i < array.Length;)
        //    {
        //        int runLength = 0;
        //        for (int j = i; j < array.Length; j++, runLength++)
        //            if (array[j].HasValue != dataRun) break;

        //        writer.Write(dataRun);
        //        writer.Write(runLength);

        //        if (dataRun)
        //        {
        //            for (int k = 0; k < runLength; k++)
        //                typeSurr.Write(writer, array[i + k].Value);
        //        }

        //        i += runLength;
        //        dataRun = !dataRun;
        //    }
        //}
    }

    #endregion

    /// <summary>
    /// Surrogate for types that inherit from <see cref="INxSerializable"/>.
    /// </summary>
    sealed class NxINxSerializableSerializationSurrogate : NxContextSensitiveSerializationSurrogate, INxBuiltinSerializationSurrogate
    {
        public NxINxSerializableSerializationSurrogate(Type t) : base(t) { }

        /// <summary>
        /// Non default object construction. The idea is to circumvent constructor calls
        /// and populate the object in <see cref="INxSerializable.Deserialize"/> method.
        /// </summary>
        /// <returns></returns>
        public override object Instantiate(NxBinaryReader reader)
        {
            return FormatterServices.GetUninitializedObject(ActualType);
        }

        public override object ReadDirect(NxBinaryReader reader, object graph)
        {
            ((INxSerializable)graph).Deserialize(reader);
            return graph;
        }

        public override void WriteDirect(NxBinaryWriter writer, object graph)
        {
            ((INxSerializable)graph).Serialize(writer);
        }
    }
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The GNU General Public License (GPLv3)


Written By
Architect
Pakistan Pakistan
Let a = b ....... (1)
a - b = a - b
a^2 - ab = a^2 - ab
a^2 - ab = a^2 - b^2 (from 1)
a (a - b) = (a + b) (a - b)
a = (a + b) ...... (2)

if a = 1
1 = (1 + 1) (from 1 & 2)
1 = 2 !!

Comments and Discussions