Esempio n. 1
0
        /** <inheritDoc /> */
        public T ToPortable <T>(object obj)
        {
            if (obj is IPortableObject)
            {
                return((T)obj);
            }

            IPortableStream stream = new PortableHeapStream(1024);

            // Serialize.
            PortableWriterImpl writer = _marsh.StartMarshal(stream);

            try
            {
                writer.Write(obj);
            }
            finally
            {
                // Save metadata.
                _marsh.FinishMarshal(writer);
            }

            // Deserialize.
            stream.Seek(0, SeekOrigin.Begin);

            return(_marsh.Unmarshal <T>(stream, PortableMode.ForcePortable));
        }
Esempio n. 2
0
        /// <summary>
        /// Marshal object.
        /// </summary>
        /// <param name="val">Value.</param>
        /// <param name="stream">Output stream.</param>
        /// <returns>Collection of metadatas (if any).</returns>
        private void Marshal <T>(T val, IPortableStream stream)
        {
            PortableWriterImpl writer = StartMarshal(stream);

            writer.Write(val);

            FinishMarshal(writer);
        }
Esempio n. 3
0
        /** <inheritDoc /> */
        public IPortableObject Build()
        {
            PortableHeapStream inStream = new PortableHeapStream(_obj.Data);

            inStream.Seek(_obj.Offset, SeekOrigin.Begin);

            // Assume that resulting length will be no less than header + [fields_cnt] * 12;
            int len = PortableUtils.FullHdrLen + (_vals == null ? 0 : _vals.Count * 12);

            PortableHeapStream outStream = new PortableHeapStream(len);

            PortableWriterImpl writer = _portables.Marshaller.StartMarshal(outStream);

            writer.Builder(this);

            // All related builders will work in this context with this writer.
            _parent._ctx = new Context(writer);

            try
            {
                // Write.
                writer.Write(this, null);

                // Process metadata.
                _portables.Marshaller.FinishMarshal(writer);

                // Create portable object once metadata is processed.
                return(new PortableUserObject(_portables.Marshaller, outStream.InternalArray, 0,
                                              _desc.TypeId, _hashCode));
            }
            finally
            {
                // Cleanup.
                _parent._ctx.Closed = true;
            }
        }