/// <summary>
        /// Creates a new instance of a <see cref="StreamObjectWriter"/>.
        /// </summary>
        /// <param name="stream">The stream to write to.</param>
        /// <param name="knownObjects">An optional list of objects assumed known by the corresponding <see cref="StreamObjectReader"/>.</param>
        /// <param name="binder">A binder that provides object and type encoding.</param>
        /// <param name="recursive">True if the writer encodes objects recursively.</param>
        /// <param name="cancellationToken"></param>
        public StreamObjectWriter(
            Stream stream,
            ObjectData knownObjects = null,
            ObjectBinder binder = null,
            bool recursive = true,
            CancellationToken cancellationToken = default(CancellationToken))
        {
            // String serialization assumes both reader and writer to be of the same endianness.
            // It can be adjusted for BigEndian if needed.
            Debug.Assert(BitConverter.IsLittleEndian);

            _writer = new BinaryWriter(stream, Encoding.UTF8);
            _referenceMap = new ReferenceMap(knownObjects);
            _binder = binder ?? FixedObjectBinder.Empty;
            _recursive = recursive;
            _cancellationToken = cancellationToken;

            WriteVersion();

            if (_recursive)
            {
                _writer.Write((byte)EncodingKind.Recursive);
            }
            else
            {
                _writer.Write((byte)EncodingKind.NonRecursive);
                _valueStack = s_variantStackPool.Allocate();
                _memberList = s_variantListPool.Allocate();
                _memberWriter = new VariantListWriter(_memberList);
            }
        }
Exemple #2
0
 internal ObjectReader(
     Stream stream,
     ObjectReaderData defaultData = null,
     ObjectBinder binder = null)
 {
     this.reader = new BinaryReader(stream, MultiByteEncoding.Instance);
     this.dataMap = new ObjectReaderData(defaultData);
     this.binder = binder;
 }
Exemple #3
0
        internal ObjectReader(
            Stream stream,
            ObjectReaderData defaultData = null,
            ObjectBinder binder = null)
        {
            // String serialization assumes both reader and writer to be of the same endianness.
            // It can be adjusted for BigEndian if needed.
            Debug.Assert(BitConverter.IsLittleEndian);

            _reader = new BinaryReader(stream, Encoding.UTF8);
            _dataMap = new ObjectReaderData(defaultData);
            _binder = binder;
        }
Exemple #4
0
 private void WriteKnownType(Type type)
 {
     _writer.Write((byte)EncodingKind.Type);
     this.WriteInt32(ObjectBinder.GetTypeId(type));
 }
Exemple #5
0
 public void WriteType(Type type)
 {
     _writer.Write((byte)EncodingKind.Type);
     this.WriteInt32(ObjectBinder.GetOrAddTypeId(type));
 }