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); }