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