private void Serialize(object obj, ArrayDefinition arrayDefinition, int constantStringLength, BinaryWriter writer)
        {
            if (obj == null)
                throw new SerializationException("Cannot serialize a null root value.");

            var objectType = obj.GetType();
            var isSimpleType = objectType.IsSimpleType();

            if (objectType.IsArray && objectType.GetArrayRank() == 1)
            {
                // a 1-dimensional array
                WriteArray((Array)obj, arrayDefinition, constantStringLength, writer);
            }
            else if (objectType.IsArray && objectType.GetArrayRank() == 2)
            {
                // a 2-dimensional ([,]) array
                WriteArray2((Array)obj, constantStringLength, writer);
            }
            else if (isSimpleType)
            {
                // a simple type (including String and Object)
                WriteSimpleObject(obj, constantStringLength, writer);
            }
            else
            {
                // a complex type
                WriteStructure(obj, writer);
            }
        }
 private object Deserialize(Type targetType, ArrayDefinition arrayDefinition, int constantStringLength, BinaryReader reader)
 {
     if (targetType.IsArray && targetType.GetArrayRank() == 1)
     {
         // a 1-dimensional array
         return ReadArray(targetType.GetElementType(), arrayDefinition, constantStringLength, reader);
     }
     else if (targetType.IsArray && targetType.GetArrayRank() == 2)
     {
         // a 2-dimensional ([,]) array
         return ReadArray2(targetType.GetElementType(), constantStringLength, reader);
     }
     else if (targetType.IsSimpleType())
     {
         // a simple type, including String and Object.
         return HydrateSimpleObject(targetType, constantStringLength, reader);
     }
     else
     {
         // a complex object
         return HydrateStructure(targetType, reader);
     }
 }
        private Array ReadArray(Type elementType, ArrayDefinition arrayDefinition, int constantStringLength, BinaryReader reader)
        {
            var len = 0;

            if (arrayDefinition.IsFixedSize)
            {
                len = arrayDefinition.FixedLength;
            }
            else
            {
                var d = ReadArrayRank(reader);

                // null arrays are just 00 00 (2 bytes)
                if (d == 0)
                    return null;

                if (d != 1)
                    throw new SerializationException(string.Format("Expected a one-dimensional array, but found a {0}-dimensional one", d));

                len = ReadArrayLength(reader);
            }

            return ReadFixedArray(elementType, len, constantStringLength, reader);
        }
 private void WriteNullArray(ArrayDefinition definition, Type arrayType, BinaryWriter writer)
 {
     WriteShort(0, writer);
 }
        private void WriteArray(Array arr, ArrayDefinition arrayDefinition, int constantStringLength, BinaryWriter writer)
        {
            if (arrayDefinition.IsFixedSize)
            {
                if (arr.Length != arrayDefinition.FixedLength)
                    throw new SerializationException(
                        string.Format(
                            "Array length mismatch: expected {0} elements but found {1}.",
                            arrayDefinition.FixedLength,
                            arr.Length));
            }
            else
            {
                // Dynamically sized arrays have an header made of rank, length and starting index.
                WriteArrayRank(1, writer);
                WriteArrayLength(arr.Length, arrayDefinition.From, writer);
            }

            WriteFixedArray(arr, constantStringLength, writer);
        }