Esempio n. 1
0
        /// <summary>
        /// Write object as a predefined type if possible.
        /// </summary>
        /// <param name="hdr">Header.</param>
        /// <param name="inStream">Input stream.</param>
        /// <param name="outStream">Output stream.</param>
        /// <param name="ctx">Context.</param>
        /// <returns><c>True</c> if was written.</returns>
        private bool WriteAsPredefined(byte hdr, PortableHeapStream inStream, IPortableStream outStream,
                                       Context ctx)
        {
            switch (hdr)
            {
            case PortableUtils.TypeByte:
                TransferBytes(inStream, outStream, 1);

                break;

            case PortableUtils.TypeShort:
                TransferBytes(inStream, outStream, 2);

                break;

            case PortableUtils.TypeInt:
                TransferBytes(inStream, outStream, 4);

                break;

            case PortableUtils.TypeLong:
                TransferBytes(inStream, outStream, 8);

                break;

            case PortableUtils.TypeFloat:
                TransferBytes(inStream, outStream, 4);

                break;

            case PortableUtils.TypeDouble:
                TransferBytes(inStream, outStream, 8);

                break;

            case PortableUtils.TypeChar:
                TransferBytes(inStream, outStream, 2);

                break;

            case PortableUtils.TypeBool:
                TransferBytes(inStream, outStream, 1);

                break;

            case PortableUtils.TypeDecimal:
                TransferBytes(inStream, outStream, 4); // Transfer scale

                int magLen = inStream.ReadInt();       // Transfer magnitude length.

                outStream.WriteInt(magLen);

                TransferBytes(inStream, outStream, magLen);     // Transfer magnitude.

                break;

            case PortableUtils.TypeString:
                PortableUtils.WriteString(PortableUtils.ReadString(inStream), outStream);

                break;

            case PortableUtils.TypeGuid:
                TransferBytes(inStream, outStream, 16);

                break;

            case PortableUtils.TypeDate:
                TransferBytes(inStream, outStream, 12);

                break;

            case PortableUtils.TypeArrayByte:
                TransferArray(inStream, outStream, 1);

                break;

            case PortableUtils.TypeArrayShort:
                TransferArray(inStream, outStream, 2);

                break;

            case PortableUtils.TypeArrayInt:
                TransferArray(inStream, outStream, 4);

                break;

            case PortableUtils.TypeArrayLong:
                TransferArray(inStream, outStream, 8);

                break;

            case PortableUtils.TypeArrayFloat:
                TransferArray(inStream, outStream, 4);

                break;

            case PortableUtils.TypeArrayDouble:
                TransferArray(inStream, outStream, 8);

                break;

            case PortableUtils.TypeArrayChar:
                TransferArray(inStream, outStream, 2);

                break;

            case PortableUtils.TypeArrayBool:
                TransferArray(inStream, outStream, 1);

                break;

            case PortableUtils.TypeArrayDecimal:
            case PortableUtils.TypeArrayString:
            case PortableUtils.TypeArrayGuid:
            case PortableUtils.TypeArrayDate:
            case PortableUtils.TypeArrayEnum:
            case PortableUtils.TypeArray:
                int arrLen = inStream.ReadInt();

                outStream.WriteInt(arrLen);

                for (int i = 0; i < arrLen; i++)
                {
                    Mutate0(ctx, inStream, outStream, false, 0, null);
                }

                break;

            case PortableUtils.TypeCollection:
                int colLen = inStream.ReadInt();

                outStream.WriteInt(colLen);

                outStream.WriteByte(inStream.ReadByte());

                for (int i = 0; i < colLen; i++)
                {
                    Mutate0(ctx, inStream, outStream, false, 0, EmptyVals);
                }

                break;

            case PortableUtils.TypeDictionary:
                int dictLen = inStream.ReadInt();

                outStream.WriteInt(dictLen);

                outStream.WriteByte(inStream.ReadByte());

                for (int i = 0; i < dictLen; i++)
                {
                    Mutate0(ctx, inStream, outStream, false, 0, EmptyVals);
                    Mutate0(ctx, inStream, outStream, false, 0, EmptyVals);
                }

                break;

            case PortableUtils.TypeMapEntry:
                Mutate0(ctx, inStream, outStream, false, 0, EmptyVals);
                Mutate0(ctx, inStream, outStream, false, 0, EmptyVals);

                break;

            case PortableUtils.TypePortable:
                TransferArray(inStream, outStream, 1);     // Data array.
                TransferBytes(inStream, outStream, 4);     // Offset in array.

                break;

            case PortableUtils.TypeEnum:
                TransferBytes(inStream, outStream, 4);     // Integer ordinal.

                break;

            default:
                return(false);
            }

            return(true);
        }