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