private static Type DeserializeDictionaryType(Protocol16Stream input, out byte keyTypeCode, out byte valueTypeCode) { keyTypeCode = (byte)input.ReadByte(); valueTypeCode = (byte)input.ReadByte(); Type keyType = GetTypeOfCode(keyTypeCode); Type valueType = GetTypeOfCode(valueTypeCode); return(typeof(Dictionary <,>).MakeGenericType(new Type[] { keyType, valueType })); }
private static Dictionary <byte, object> DeserializeParameterTable(Protocol16Stream input) { int dictionarySize = DeserializeShort(input); var dictionary = new Dictionary <byte, object>(dictionarySize); for (int i = 0; i < dictionarySize; i++) { byte key = (byte)input.ReadByte(); byte valueTypeCode = (byte)input.ReadByte(); object value = Deserialize(input, valueTypeCode); dictionary[key] = value; } return(dictionary); }
private static IDictionary DeserializeDictionary(Protocol16Stream input) { byte keyTypeCode = (byte)input.ReadByte(); byte valueTypeCode = (byte)input.ReadByte(); int dictionarySize = DeserializeShort(input); Type keyType = GetTypeOfCode(keyTypeCode); Type valueType = GetTypeOfCode(valueTypeCode); Type dictionaryType = typeof(Dictionary <,>).MakeGenericType(new Type[] { keyType, valueType }); IDictionary output = Activator.CreateInstance(dictionaryType) as IDictionary; DeserializeDictionaryElements(input, output, dictionarySize, keyTypeCode, valueTypeCode); return(output); }
private static bool DeserializeDictionaryArray(Protocol16Stream input, short size, out Array result) { Type type = DeserializeDictionaryType(input, out byte keyTypeCode, out byte valueTypeCode); result = Array.CreateInstance(type, size); for (short i = 0; i < size; i++) { if (!(Activator.CreateInstance(type) is IDictionary dictionary)) { return(false); } short arraySize = DeserializeShort(input); for (int j = 0; j < arraySize; j++) { object key; if (keyTypeCode > 0) { key = Deserialize(input, keyTypeCode); } else { byte nextKeyTypeCode = (byte)input.ReadByte(); key = Deserialize(input, nextKeyTypeCode); } object value; if (valueTypeCode > 0) { value = Deserialize(input, valueTypeCode); } else { byte nextValueTypeCode = (byte)input.ReadByte(); value = Deserialize(input, nextValueTypeCode); } dictionary.Add(key, value); } result.SetValue(dictionary, i); } return(true); }
private static Array DeserializeArray(Protocol16Stream input) { short size = DeserializeShort(input); byte typeCode = (byte)input.ReadByte(); switch ((Protocol16Type)typeCode) { case Protocol16Type.Array: { Array array = DeserializeArray(input); Type arrayType = array.GetType(); Array result = Array.CreateInstance(arrayType, size); result.SetValue(array, 0); for (short i = 1; i < size; i++) { array = DeserializeArray(input); result.SetValue(array, i); } return(result); } case Protocol16Type.ByteArray: { byte[][] array = new byte[size][]; for (short i = 0; i < size; i++) { array[i] = DeserializeByteArray(input); } return(array); } case Protocol16Type.Dictionary: { DeserializeDictionaryArray(input, size, out Array result); return(result); } default: { Type arrayType = GetTypeOfCode(typeCode); Array result = Array.CreateInstance(arrayType, size); for (short i = 0; i < size; i++) { result.SetValue(Deserialize(input, typeCode), i); } return(result); } } }
private static object[] DeserializeObjectArray(Protocol16Stream input) { int arraySize = DeserializeShort(input); var array = new object[arraySize]; for (int i = 0; i < arraySize; i++) { byte typeCode = (byte)input.ReadByte(); array[i] = Deserialize(input, typeCode); } return(array); }
private static void DeserializeDictionaryElements(Protocol16Stream input, IDictionary output, int dictionarySize, byte keyTypeCode, byte valueTypeCode) { for (int i = 0; i < dictionarySize; i++) { object key = Deserialize(input, (keyTypeCode == 0 || keyTypeCode == 42) ? ((byte)input.ReadByte()) : keyTypeCode); object value = Deserialize(input, (valueTypeCode == 0 || valueTypeCode == 42) ? ((byte)input.ReadByte()) : valueTypeCode); output.Add(key, value); } }
private static bool DeserializeBoolean(Protocol16Stream input) { return(input.ReadByte() != 0); }
private static byte DeserializeByte(Protocol16Stream stream) { return((byte)stream.ReadByte()); }
public static object Deserialize(Protocol16Stream input) { return(Deserialize(input, (byte)input.ReadByte())); }