Пример #1
0
        public object Deserialize(EndianAwareBinaryReader reader, SerializedType serializedType, int? length = null)
        {
            int? effectiveLength = null;

            if (length != null)
                effectiveLength = length.Value;
            else if (TypeNode.FieldLengthBinding != null)
            {
                object lengthValue = TypeNode.FieldLengthBinding.GetValue(this);
                effectiveLength = Convert.ToInt32(lengthValue);
            }
            else if (TypeNode.FieldCountBinding != null)
            {
                object countValue = TypeNode.FieldCountBinding.GetValue(this);
                effectiveLength = Convert.ToInt32(countValue);
            }
            else if (serializedType == SerializedType.ByteArray || serializedType == SerializedType.SizedString || serializedType == SerializedType.NullTerminatedString)
            {
                // try to get bounded length from limiter
                var baseStream = (StreamLimiter) reader.BaseStream;

                checked
                {
                    effectiveLength = (int) (baseStream.AvailableForReading);
                }
            }

            object value;
            switch (serializedType)
            {
                case SerializedType.Int1:
                    value = reader.ReadSByte();
                    break;
                case SerializedType.UInt1:
                    value = reader.ReadByte();
                    break;
                case SerializedType.Int2:
                    value = reader.ReadInt16();
                    break;
                case SerializedType.UInt2:
                    value = reader.ReadUInt16();
                    break;
                case SerializedType.Int4:
                    value = reader.ReadInt32();
                    break;
                case SerializedType.UInt4:
                    value = reader.ReadUInt32();
                    break;
                case SerializedType.Int8:
                    value = reader.ReadInt64();
                    break;
                case SerializedType.UInt8:
                    value = reader.ReadUInt64();
                    break;
                case SerializedType.Float4:
                    value = reader.ReadSingle();
                    break;
                case SerializedType.Float8:
                    value = reader.ReadDouble();
                    break;
                case SerializedType.ByteArray:
                {
                    Debug.Assert(effectiveLength != null, "effectiveLength != null");
                    value = reader.ReadBytes(effectiveLength.Value);
                    break;
                }
                case SerializedType.NullTerminatedString:
                {
                    Debug.Assert(effectiveLength != null, "effectiveLength != null");
                    byte[] data = ReadNullTerminatedString(reader, effectiveLength.Value).ToArray();

                    value = Encoding.GetString(data, 0, data.Length);
                    break;
                }
                case SerializedType.SizedString:
                {
                    Debug.Assert(effectiveLength != null, "effectiveLength != null");
                    byte[] data = reader.ReadBytes(effectiveLength.Value);
                    value = Encoding.GetString(data, 0, data.Length).TrimEnd('\0');
                    break;
                }
                case SerializedType.LengthPrefixedString:
                {
                    value = reader.ReadString();
                    break;
                }

                default:
                    throw new NotSupportedException();
            }

            return value;
        }
Пример #2
0
 public object Deserialize(StreamLimiter stream, SerializedType serializedType, int? length = null)
 {
     var reader = new EndianAwareBinaryReader(stream, Endianness);
     return Deserialize(reader, serializedType, length);
 }