提交 aec6b9d8 编写于 作者: C CyrusNajmabadi

Merge the different readers into one type.

上级 5da8d0a7
......@@ -205,7 +205,7 @@ public static SyntaxNode DeserializeFrom(Stream stream, CancellationToken cancel
}
using (var reader = StreamObjectReader.TryGetReader(stream, knownObjects: GetDeserializationObjectData(), binder: s_defaultBinder, cancellationToken: cancellationToken))
using (var reader = ObjectReader.TryGetReader(stream, knownObjects: GetDeserializationObjectData(), binder: s_defaultBinder, cancellationToken: cancellationToken))
{
if (reader == null)
{
......
......@@ -210,7 +210,7 @@ private static void RoundTrip(string text, bool expectRecursive = true)
root.SerializeTo(stream);
stream.Position = 2;
Assert.Equal(expectRecursive, Roslyn.Utilities.StreamObjectReader.IsRecursive(stream));
Assert.Equal(expectRecursive, Roslyn.Utilities.ObjectReader.IsRecursive(stream));
stream.Position = 0;
var newRoot = CSharpSyntaxNode.DeserializeFrom(stream);
......
......@@ -21,7 +21,7 @@ private void TestInvalidStreamVersion()
stream.Position = 0;
var reader = StreamObjectReader.TryGetReader(stream);
var reader = ObjectReader.TryGetReader(stream);
Assert.Null(reader);
}
......@@ -29,16 +29,16 @@ private void RoundTrip(Action<ObjectWriter> writeAction, Action<ObjectReader> re
{
var stream = new MemoryStream();
var binder = new ObjectBinder();
var writer = new StreamObjectWriter(stream, binder: binder, recursive: recursive);
var writer = new ObjectWriter(stream, binder: binder, recursive: recursive);
writeAction(writer);
writer.Dispose();
stream.Position = 2;
Assert.Equal(recursive, StreamObjectReader.IsRecursive(stream));
Assert.Equal(recursive, ObjectReader.IsRecursive(stream));
stream.Position = 0;
using (var reader = StreamObjectReader.TryGetReader(stream, binder: binder))
using (var reader = ObjectReader.TryGetReader(stream, binder: binder))
{
readAction(reader);
}
......@@ -54,16 +54,16 @@ private T RoundTrip<T>(T value, Action<ObjectWriter, T> writeAction, Func<Object
{
var stream = new MemoryStream();
var binder = new ObjectBinder();
var writer = new StreamObjectWriter(stream, binder: binder, recursive: recursive);
var writer = new ObjectWriter(stream, binder: binder, recursive: recursive);
writeAction(writer, value);
writer.Dispose();
stream.Position = 2;
Assert.Equal(recursive, StreamObjectReader.IsRecursive(stream));
Assert.Equal(recursive, ObjectReader.IsRecursive(stream));
stream.Position = 0;
using (var reader = StreamObjectReader.TryGetReader(stream, binder: binder))
using (var reader = ObjectReader.TryGetReader(stream, binder: binder))
{
return (T)readAction(reader);
}
......@@ -380,36 +380,36 @@ public void TestEnumMember()
[Fact]
public void TestInt32EncodingKinds()
{
Assert.Equal(StreamObjectWriter.EncodingKind.Int32_1, StreamObjectWriter.EncodingKind.Int32_0 + 1);
Assert.Equal(StreamObjectWriter.EncodingKind.Int32_2, StreamObjectWriter.EncodingKind.Int32_0 + 2);
Assert.Equal(StreamObjectWriter.EncodingKind.Int32_3, StreamObjectWriter.EncodingKind.Int32_0 + 3);
Assert.Equal(StreamObjectWriter.EncodingKind.Int32_4, StreamObjectWriter.EncodingKind.Int32_0 + 4);
Assert.Equal(StreamObjectWriter.EncodingKind.Int32_5, StreamObjectWriter.EncodingKind.Int32_0 + 5);
Assert.Equal(StreamObjectWriter.EncodingKind.Int32_6, StreamObjectWriter.EncodingKind.Int32_0 + 6);
Assert.Equal(StreamObjectWriter.EncodingKind.Int32_7, StreamObjectWriter.EncodingKind.Int32_0 + 7);
Assert.Equal(StreamObjectWriter.EncodingKind.Int32_8, StreamObjectWriter.EncodingKind.Int32_0 + 8);
Assert.Equal(StreamObjectWriter.EncodingKind.Int32_9, StreamObjectWriter.EncodingKind.Int32_0 + 9);
Assert.Equal(StreamObjectWriter.EncodingKind.Int32_10, StreamObjectWriter.EncodingKind.Int32_0 + 10);
Assert.Equal(ObjectWriter.EncodingKind.Int32_1, ObjectWriter.EncodingKind.Int32_0 + 1);
Assert.Equal(ObjectWriter.EncodingKind.Int32_2, ObjectWriter.EncodingKind.Int32_0 + 2);
Assert.Equal(ObjectWriter.EncodingKind.Int32_3, ObjectWriter.EncodingKind.Int32_0 + 3);
Assert.Equal(ObjectWriter.EncodingKind.Int32_4, ObjectWriter.EncodingKind.Int32_0 + 4);
Assert.Equal(ObjectWriter.EncodingKind.Int32_5, ObjectWriter.EncodingKind.Int32_0 + 5);
Assert.Equal(ObjectWriter.EncodingKind.Int32_6, ObjectWriter.EncodingKind.Int32_0 + 6);
Assert.Equal(ObjectWriter.EncodingKind.Int32_7, ObjectWriter.EncodingKind.Int32_0 + 7);
Assert.Equal(ObjectWriter.EncodingKind.Int32_8, ObjectWriter.EncodingKind.Int32_0 + 8);
Assert.Equal(ObjectWriter.EncodingKind.Int32_9, ObjectWriter.EncodingKind.Int32_0 + 9);
Assert.Equal(ObjectWriter.EncodingKind.Int32_10, ObjectWriter.EncodingKind.Int32_0 + 10);
}
[Fact]
public void TestUInt32EncodingKinds()
{
Assert.Equal(StreamObjectWriter.EncodingKind.UInt32_1, StreamObjectWriter.EncodingKind.UInt32_0 + 1);
Assert.Equal(StreamObjectWriter.EncodingKind.UInt32_2, StreamObjectWriter.EncodingKind.UInt32_0 + 2);
Assert.Equal(StreamObjectWriter.EncodingKind.UInt32_3, StreamObjectWriter.EncodingKind.UInt32_0 + 3);
Assert.Equal(StreamObjectWriter.EncodingKind.UInt32_4, StreamObjectWriter.EncodingKind.UInt32_0 + 4);
Assert.Equal(StreamObjectWriter.EncodingKind.UInt32_5, StreamObjectWriter.EncodingKind.UInt32_0 + 5);
Assert.Equal(StreamObjectWriter.EncodingKind.UInt32_6, StreamObjectWriter.EncodingKind.UInt32_0 + 6);
Assert.Equal(StreamObjectWriter.EncodingKind.UInt32_7, StreamObjectWriter.EncodingKind.UInt32_0 + 7);
Assert.Equal(StreamObjectWriter.EncodingKind.UInt32_8, StreamObjectWriter.EncodingKind.UInt32_0 + 8);
Assert.Equal(StreamObjectWriter.EncodingKind.UInt32_9, StreamObjectWriter.EncodingKind.UInt32_0 + 9);
Assert.Equal(StreamObjectWriter.EncodingKind.UInt32_10, StreamObjectWriter.EncodingKind.UInt32_0 + 10);
Assert.Equal(ObjectWriter.EncodingKind.UInt32_1, ObjectWriter.EncodingKind.UInt32_0 + 1);
Assert.Equal(ObjectWriter.EncodingKind.UInt32_2, ObjectWriter.EncodingKind.UInt32_0 + 2);
Assert.Equal(ObjectWriter.EncodingKind.UInt32_3, ObjectWriter.EncodingKind.UInt32_0 + 3);
Assert.Equal(ObjectWriter.EncodingKind.UInt32_4, ObjectWriter.EncodingKind.UInt32_0 + 4);
Assert.Equal(ObjectWriter.EncodingKind.UInt32_5, ObjectWriter.EncodingKind.UInt32_0 + 5);
Assert.Equal(ObjectWriter.EncodingKind.UInt32_6, ObjectWriter.EncodingKind.UInt32_0 + 6);
Assert.Equal(ObjectWriter.EncodingKind.UInt32_7, ObjectWriter.EncodingKind.UInt32_0 + 7);
Assert.Equal(ObjectWriter.EncodingKind.UInt32_8, ObjectWriter.EncodingKind.UInt32_0 + 8);
Assert.Equal(ObjectWriter.EncodingKind.UInt32_9, ObjectWriter.EncodingKind.UInt32_0 + 9);
Assert.Equal(ObjectWriter.EncodingKind.UInt32_10, ObjectWriter.EncodingKind.UInt32_0 + 10);
}
private void TestRoundTripCompressedUint(uint value)
{
TestRoundTrip(value, (w, v) => ((StreamObjectWriter)w).WriteCompressedUInt(v), r => ((StreamObjectReader)r).ReadCompressedUInt());
TestRoundTrip(value, (w, v) => ((ObjectWriter)w).WriteCompressedUInt(v), r => ((ObjectReader)r).ReadCompressedUInt());
}
[Fact]
......@@ -1063,7 +1063,7 @@ public void TestObjectMapLimits()
}
var binder = new ObjectBinder();
var writer = new StreamObjectWriter(stream, binder: binder);
var writer = new ObjectWriter(stream, binder: binder);
// Write each instance twice. The second time around, they'll become ObjectRefs
for (int pass = 0; pass < 2; pass++)
{
......@@ -1076,7 +1076,7 @@ public void TestObjectMapLimits()
writer.Dispose();
stream.Position = 0;
using (var reader = StreamObjectReader.TryGetReader(stream, binder: binder))
using (var reader = ObjectReader.TryGetReader(stream, binder: binder))
{
for (int pass = 0; pass < 2; pass++)
{
......@@ -1113,7 +1113,7 @@ public void TestDeepObjectGraph_RecursiveFails()
{
int id = 0;
var graph = ConstructGraph(ref id, 1, 1000);
Assert.Throws<StreamObjectWriter.RecursionDepthExceeded>(() => TestRoundTripValue(graph));
Assert.Throws<ObjectWriter.RecursionDepthExceeded>(() => TestRoundTripValue(graph));
}
[Fact]
......
......@@ -10,7 +10,7 @@ namespace Roslyn.Utilities
/// </summary>
/// <remarks>
/// This class is just a sneaky way to get a reference to an ImmutableArray,
/// due to <see cref="StreamObjectWriter"/> needing to be able to use it as a key for a ConditionalWeakTable.
/// due to <see cref="ObjectWriter"/> needing to be able to use it as a key for a ConditionalWeakTable.
/// </remarks>
internal class ObjectData
{
......
......@@ -2,6 +2,7 @@
namespace Roslyn.Utilities
{
#if false
/// <summary>
/// An abstract of a stream of values that can be read from.
/// </summary>
......@@ -23,4 +24,5 @@ internal abstract class ObjectReader
public abstract string ReadString();
public abstract object ReadValue();
}
#endif
}
......@@ -2,6 +2,7 @@
namespace Roslyn.Utilities
{
#if false
/// <summary>
/// An abstraction of a stream of values that can be written to.
/// </summary>
......@@ -23,4 +24,5 @@ internal abstract class ObjectWriter
public abstract void WriteString(string value);
public abstract void WriteValue(object value);
}
#endif
}
......@@ -2,6 +2,7 @@
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Diagnostics;
using System.IO;
using System.Runtime.CompilerServices;
......@@ -17,15 +18,15 @@ namespace Roslyn.Utilities
using Resources = WorkspacesResources;
#endif
using SOW = StreamObjectWriter;
using EncodingKind = StreamObjectWriter.EncodingKind;
using Variant = StreamObjectWriter.Variant;
using VariantKind = StreamObjectWriter.VariantKind;
using SOW = ObjectWriter;
using EncodingKind = ObjectWriter.EncodingKind;
using Variant = ObjectWriter.Variant;
using VariantKind = ObjectWriter.VariantKind;
/// <summary>
/// An <see cref="ObjectReader"/> that deserializes objects from a byte stream.
/// </summary>
internal sealed partial class StreamObjectReader : ObjectReader, IDisposable
internal sealed partial class ObjectReader : IDisposable
{
/// <summary>
/// We start the version at something reasonably random. That way an older file, with
......@@ -59,24 +60,20 @@ internal sealed partial class StreamObjectReader : ObjectReader, IDisposable
/// <summary>
/// List of member values that object deserializers read from.
/// </summary>
private readonly List<Variant> _memberList;
/// <summary>
/// Used to provide member values when reading and constructing objects.
/// </summary>
private readonly VariantListReader _memberReader;
private readonly ImmutableArray<Variant>.Builder _memberList;
private int _indexInMemberList;
private static readonly ObjectPool<Stack<Construction>> s_constructionStackPool
= new ObjectPool<Stack<Construction>>(() => new Stack<Construction>(20));
/// <summary>
/// Creates a new instance of a <see cref="StreamObjectReader"/>.
/// Creates a new instance of a <see cref="ObjectReader"/>.
/// </summary>
/// <param name="stream">The stream to read objects from.</param>
/// <param name="knownObjects">An optional list of objects assumed known by the corresponding <see cref="StreamObjectWriter"/>.</param>
/// <param name="knownObjects">An optional list of objects assumed known by the corresponding <see cref="ObjectWriter"/>.</param>
/// <param name="binder">A binder that provides object and type decoding.</param>
/// <param name="cancellationToken"></param>
private StreamObjectReader(
private ObjectReader(
Stream stream,
ObjectData knownObjects,
ObjectBinder binder,
......@@ -99,16 +96,15 @@ internal sealed partial class StreamObjectReader : ObjectReader, IDisposable
_valueStack = SOW.s_variantStackPool.Allocate();
_constructionStack = s_constructionStackPool.Allocate();
_memberList = SOW.s_variantListPool.Allocate();
_memberReader = new VariantListReader(_memberList);
}
}
/// <summary>
/// Attempts to create a <see cref="StreamObjectReader"/> from the provided <paramref name="stream"/>.
/// Attempts to create a <see cref="ObjectReader"/> from the provided <paramref name="stream"/>.
/// If the <paramref name="stream"/> does not start with a valid header, then <code>null</code> will
/// be returned.
/// </summary>
public static StreamObjectReader TryGetReader(
public static ObjectReader TryGetReader(
Stream stream,
ObjectData knownObjects = null,
ObjectBinder binder = null,
......@@ -125,7 +121,7 @@ internal sealed partial class StreamObjectReader : ObjectReader, IDisposable
return null;
}
return new StreamObjectReader(stream, knownObjects, binder, cancellationToken);
return new ObjectReader(stream, knownObjects, binder, cancellationToken);
}
internal static bool IsRecursive(Stream stream)
......@@ -160,79 +156,95 @@ public void Dispose()
}
}
public override bool ReadBoolean()
{
return _reader.ReadBoolean();
}
public override byte ReadByte()
{
return _reader.ReadByte();
}
public override char ReadChar()
{
// read as ushort because BinaryWriter fails on chars that are unicode surrogates
return (char)_reader.ReadUInt16();
}
public override decimal ReadDecimal()
{
return _reader.ReadDecimal();
}
public override double ReadDouble()
{
return _reader.ReadDouble();
}
public override float ReadSingle()
{
return _reader.ReadSingle();
}
public override int ReadInt32()
{
return _reader.ReadInt32();
}
public override long ReadInt64()
{
return _reader.ReadInt64();
}
public override sbyte ReadSByte()
{
return _reader.ReadSByte();
}
public override short ReadInt16()
{
return _reader.ReadInt16();
}
public override uint ReadUInt32()
{
return _reader.ReadUInt32();
}
public override ulong ReadUInt64()
{
return _reader.ReadUInt64();
}
public override ushort ReadUInt16()
private void ResetMemberList()
{
return _reader.ReadUInt16();
_memberList.Clear();
_indexInMemberList = 0;
}
public override string ReadString()
private Variant NextFromMemberList()
=> _memberList[_indexInMemberList++];
private bool ShouldReadFromMemberList => _memberList.Count > 0;
public bool ReadBoolean()
=> ShouldReadFromMemberList
? NextFromMemberList().AsBoolean()
: _reader.ReadBoolean();
public byte ReadByte()
=> ShouldReadFromMemberList
? NextFromMemberList().AsByte()
: _reader.ReadByte();
// read as ushort because BinaryWriter fails on chars that are unicode surrogates
public char ReadChar()
=> ShouldReadFromMemberList
? NextFromMemberList().AsChar()
: (char)_reader.ReadUInt16();
public decimal ReadDecimal()
=> ShouldReadFromMemberList
? NextFromMemberList().AsDecimal()
: _reader.ReadDecimal();
public double ReadDouble()
=> ShouldReadFromMemberList
? NextFromMemberList().AsDouble()
: _reader.ReadDouble();
public float ReadSingle()
=> ShouldReadFromMemberList
? NextFromMemberList().AsSingle()
: _reader.ReadSingle();
public int ReadInt32()
=> ShouldReadFromMemberList
? NextFromMemberList().AsInt32()
: _reader.ReadInt32();
public long ReadInt64()
=> ShouldReadFromMemberList
? NextFromMemberList().AsInt64()
: _reader.ReadInt64();
public sbyte ReadSByte()
=> ShouldReadFromMemberList
? NextFromMemberList().AsSByte()
: _reader.ReadSByte();
public short ReadInt16()
=> ShouldReadFromMemberList
? NextFromMemberList().AsInt16()
: _reader.ReadInt16();
public uint ReadUInt32()
=> ShouldReadFromMemberList
? NextFromMemberList().AsUInt32()
: _reader.ReadUInt32();
public ulong ReadUInt64()
=> ShouldReadFromMemberList
? NextFromMemberList().AsUInt64()
: _reader.ReadUInt64();
public ushort ReadUInt16()
=> ShouldReadFromMemberList
? NextFromMemberList().AsUInt16()
: _reader.ReadUInt16();
public string ReadString()
=> ShouldReadFromMemberList
? ReadStringFromMemberList()
: ReadStringValue();
public object ReadValue()
{
return ReadStringValue();
}
if (ShouldReadFromMemberList)
{
return ReadValueFromMemberList();
}
public override object ReadValue()
{
var v = ReadVariant();
// if we didn't get anything, it must have been an object or array header
......@@ -244,6 +256,17 @@ public override object ReadValue()
return v.ToBoxedObject();
}
private string ReadStringFromMemberList()
{
var next = NextFromMemberList();
return next.Kind == VariantKind.Null
? null
: next.AsString();
}
private object ReadValueFromMemberList()
=> NextFromMemberList().ToBoxedObject();
private Variant ConstructFromValues()
{
Debug.Assert(_constructionStack.Count > 0);
......@@ -333,7 +356,7 @@ public static Construction CreateArrayConstruction(Type elementType, int element
return new Construction(elementType, elementCount, stackStart, reader: null, id: 0);
}
public Variant Construct(StreamObjectReader reader)
public Variant Construct(ObjectReader reader)
{
if (_reader != null)
{
......@@ -448,113 +471,6 @@ private Variant ReadVariant()
}
}
private class VariantListReader : ObjectReader
{
private readonly List<Variant> _list;
private int _index;
public VariantListReader(List<Variant> list)
{
_list = list;
}
public void Reset()
{
_list.Clear();
_index = 0;
}
public int Position => _index;
private Variant Next()
{
return _list[_index++];
}
public override bool ReadBoolean()
{
return Next().AsBoolean();
}
public override byte ReadByte()
{
return Next().AsByte();
}
public override char ReadChar()
{
return Next().AsChar();
}
public override decimal ReadDecimal()
{
return Next().AsDecimal();
}
public override double ReadDouble()
{
return Next().AsDouble();
}
public override float ReadSingle()
{
return Next().AsSingle();
}
public override int ReadInt32()
{
return Next().AsInt32();
}
public override long ReadInt64()
{
return Next().AsInt64();
}
public override sbyte ReadSByte()
{
return Next().AsSByte();
}
public override short ReadInt16()
{
return Next().AsInt16();
}
public override uint ReadUInt32()
{
return Next().AsUInt32();
}
public override ulong ReadUInt64()
{
return Next().AsUInt64();
}
public override ushort ReadUInt16()
{
return Next().AsUInt16();
}
public override String ReadString()
{
var next = Next();
if (next.Kind == VariantKind.Null)
{
return null;
}
else
{
return next.AsString();
}
}
public override Object ReadValue()
{
return Next().ToBoxedObject();
}
}
/// <summary>
/// An reference-id to object map, that can share base data efficiently.
/// </summary>
......@@ -614,21 +530,21 @@ public T GetValue(int referenceId)
internal uint ReadCompressedUInt()
{
var info = _reader.ReadByte();
byte marker = (byte)(info & StreamObjectWriter.ByteMarkerMask);
byte byte0 = (byte)(info & ~StreamObjectWriter.ByteMarkerMask);
byte marker = (byte)(info & ObjectWriter.ByteMarkerMask);
byte byte0 = (byte)(info & ~ObjectWriter.ByteMarkerMask);
if (marker == StreamObjectWriter.Byte1Marker)
if (marker == ObjectWriter.Byte1Marker)
{
return byte0;
}
if (marker == StreamObjectWriter.Byte2Marker)
if (marker == ObjectWriter.Byte2Marker)
{
var byte1 = _reader.ReadByte();
return (((uint)byte0) << 8) | byte1;
}
if (marker == StreamObjectWriter.Byte4Marker)
if (marker == ObjectWriter.Byte4Marker)
{
var byte1 = _reader.ReadByte();
var byte2 = _reader.ReadByte();
......@@ -716,7 +632,7 @@ private Variant ReadArray(EncodingKind kind)
// SUBTLE: If it was a primitive array, only the EncodingKind byte of the element type was written, instead of encoding as a type.
var elementKind = (EncodingKind)_reader.ReadByte();
var elementType = StreamObjectWriter.s_reverseTypeMap[(int)elementKind];
var elementType = ObjectWriter.s_reverseTypeMap[(int)elementKind];
if (elementType != null)
{
return Variant.FromArray(this.ReadPrimitiveTypeArrayElements(elementType, elementKind, length));
......@@ -764,7 +680,7 @@ private Variant ConstructArray(Type elementType, int length)
private Array ReadPrimitiveTypeArrayElements(Type type, EncodingKind kind, int length)
{
Debug.Assert(StreamObjectWriter.s_reverseTypeMap[(int)kind] == type);
Debug.Assert(ObjectWriter.s_reverseTypeMap[(int)kind] == type);
// optimizations for supported array type by binary reader
if (type == typeof(byte))
......@@ -1087,25 +1003,31 @@ private Variant ReadObject()
private Variant ConstructObject(Type type, int memberCount, Func<ObjectReader, object> reader, int id)
{
_memberReader.Reset();
Debug.Assert(_memberList.Count == 0);
Debug.Assert(_indexInMemberList == 0);
_memberList.Count = memberCount;
// take members from the stack
for (int i = 0; i < memberCount; i++)
{
_memberList.Add(_valueStack.Pop());
_memberList[memberCount - i - 1] = _valueStack.Pop();
// _memberList.Add(_valueStack.Pop());
}
// reverse list so that first member to be read is first
Reverse(_memberList);
// Reverse(_memberList);
// invoke the deserialization constructor to create instance and read & assign members
var instance = reader(_memberReader);
var instance = reader(this);
if (_memberReader.Position != memberCount)
if (_indexInMemberList != memberCount)
{
throw DeserializationReadIncorrectNumberOfValuesException(type.Name);
}
ResetMemberList();
_objectReferenceMap.SetValue(id, instance);
return Variant.FromObject(instance);
......
......@@ -23,7 +23,7 @@ namespace Roslyn.Utilities
/// <summary>
/// An <see cref="ObjectWriter"/> that serializes objects to a byte stream.
/// </summary>
internal sealed partial class StreamObjectWriter : ObjectWriter, IDisposable
internal sealed partial class ObjectWriter : IDisposable
{
private readonly BinaryWriter _writer;
private readonly ObjectBinder _binderOpt;
......@@ -46,29 +46,25 @@ internal sealed partial class StreamObjectWriter : ObjectWriter, IDisposable
/// <summary>
/// The list of member values written by the member writer
/// </summary>
private readonly List<Variant> _memberList;
/// <summary>
/// An <see cref="ObjectWriter"/> that is used to write object members into a list of variants.
/// </summary>
private readonly VariantListWriter _memberWriter;
private readonly ImmutableArray<Variant>.Builder _memberList;
private bool _writingMembers = false;
// collection pools to reduce GC overhead
internal static readonly ObjectPool<List<Variant>> s_variantListPool
= new ObjectPool<List<Variant>>(() => new List<Variant>(20));
internal static readonly ObjectPool<ImmutableArray<Variant>.Builder> s_variantListPool
= new ObjectPool<ImmutableArray<Variant>.Builder>(() => ImmutableArray.CreateBuilder<Variant>(20));
internal static readonly ObjectPool<Stack<Variant>> s_variantStackPool
= new ObjectPool<Stack<Variant>>(() => new Stack<Variant>(20));
/// <summary>
/// Creates a new instance of a <see cref="StreamObjectWriter"/>.
/// Creates a new instance of a <see cref="ObjectWriter"/>.
/// </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="knownObjects">An optional list of objects assumed known by the corresponding <see cref="ObjectReader"/>.</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(
public ObjectWriter(
Stream stream,
ObjectData knownObjects = null,
ObjectBinder binder = null,
......@@ -97,14 +93,13 @@ internal sealed partial class StreamObjectWriter : ObjectWriter, IDisposable
_writer.Write((byte)EncodingKind.NonRecursive);
_valueStack = s_variantStackPool.Allocate();
_memberList = s_variantListPool.Allocate();
_memberWriter = new VariantListWriter(_memberList);
}
}
private void WriteVersion()
{
_writer.Write(StreamObjectReader.VersionByte1);
_writer.Write(StreamObjectReader.VersionByte2);
_writer.Write(ObjectReader.VersionByte1);
_writer.Write(ObjectReader.VersionByte2);
}
public void Dispose()
......@@ -122,88 +117,200 @@ public void Dispose()
}
}
public override void WriteBoolean(bool value)
public void WriteBoolean(bool value)
{
_writer.Write(value);
if (_writingMembers)
{
_memberList.Add(Variant.FromBoolean(value));
}
else
{
_writer.Write(value);
}
}
public override void WriteByte(byte value)
public void WriteByte(byte value)
{
_writer.Write(value);
if (_writingMembers)
{
_memberList.Add(Variant.FromByte(value));
}
else
{
_writer.Write(value);
}
}
public override void WriteChar(char ch)
public void WriteChar(char ch)
{
// written as ushort because BinaryWriter fails on chars that are unicode surrogates
_writer.Write((ushort)ch);
if (_writingMembers)
{
_memberList.Add(Variant.FromChar(ch));
}
else
{
// written as ushort because BinaryWriter fails on chars that are unicode surrogates
_writer.Write((ushort)ch);
}
}
public override void WriteDecimal(decimal value)
public void WriteDecimal(decimal value)
{
_writer.Write(value);
if (_writingMembers)
{
_memberList.Add(Variant.FromDecimal(value));
}
else
{
_writer.Write(value);
}
}
public override void WriteDouble(double value)
public void WriteDouble(double value)
{
_writer.Write(value);
if (_writingMembers)
{
_memberList.Add(Variant.FromDouble(value));
}
else
{
_writer.Write(value);
}
}
public override void WriteSingle(float value)
public void WriteSingle(float value)
{
_writer.Write(value);
if (_writingMembers)
{
_memberList.Add(Variant.FromSingle(value));
}
else
{
_writer.Write(value);
}
}
public override void WriteInt32(int value)
public void WriteInt32(int value)
{
_writer.Write(value);
if (_writingMembers)
{
_memberList.Add(Variant.FromInt32(value));
}
else
{
_writer.Write(value);
}
}
public override void WriteInt64(long value)
public void WriteInt64(long value)
{
_writer.Write(value);
if (_writingMembers)
{
_memberList.Add(Variant.FromInt64(value));
}
else
{
_writer.Write(value);
}
}
public override void WriteSByte(sbyte value)
public void WriteSByte(sbyte value)
{
_writer.Write(value);
if (_writingMembers)
{
_memberList.Add(Variant.FromSByte(value));
}
else
{
_writer.Write(value);
}
}
public override void WriteInt16(short value)
public void WriteInt16(short value)
{
_writer.Write(value);
if (_writingMembers)
{
_memberList.Add(Variant.FromInt16(value));
}
else
{
_writer.Write(value);
}
}
public override void WriteUInt32(uint value)
public void WriteUInt32(uint value)
{
_writer.Write(value);
if (_writingMembers)
{
_memberList.Add(Variant.FromUInt32(value));
}
else
{
_writer.Write(value);
}
}
public override void WriteUInt64(ulong value)
public void WriteUInt64(ulong value)
{
_writer.Write(value);
if (_writingMembers)
{
_memberList.Add(Variant.FromUInt64(value));
}
else
{
_writer.Write(value);
}
}
public override void WriteUInt16(ushort value)
public void WriteUInt16(ushort value)
{
_writer.Write(value);
if (_writingMembers)
{
_memberList.Add(Variant.FromUInt16(value));
}
else
{
_writer.Write(value);
}
}
public override void WriteString(string value)
public void WriteString(string value)
{
WriteStringValue(value);
if (_writingMembers)
{
if (value == null)
{
_memberList.Add(Variant.Null);
}
else
{
_memberList.Add(Variant.FromString(value));
}
}
else
{
WriteStringValue(value);
}
}
public override void WriteValue(object value)
public void WriteValue(object value)
{
Debug.Assert(value == null || !value.GetType().GetTypeInfo().IsEnum, "Enum should not be written with WriteValue. Write them as ints instead.");
if (_recursive)
if (_writingMembers)
{
WriteVariant(Variant.FromBoxedObject(value));
_memberList.Add(Variant.FromBoxedObject(value));
}
else
{
_valueStack.Push(Variant.FromBoxedObject(value));
Emit();
Debug.Assert(value == null || !value.GetType().GetTypeInfo().IsEnum, "Enum should not be written with WriteValue. Write them as ints instead.");
if (_recursive)
{
WriteVariant(Variant.FromBoxedObject(value));
}
else
{
_valueStack.Push(Variant.FromBoxedObject(value));
Emit();
}
}
}
......@@ -358,101 +465,6 @@ private void WriteVariant(Variant value)
}
}
/// <summary>
/// An <see cref="ObjectWriter"/> that writes into a list of <see cref="Variant"/>.
/// </summary>
private class VariantListWriter : ObjectWriter
{
private readonly List<Variant> _list;
public VariantListWriter(List<Variant> list)
{
_list = list;
}
public override void WriteBoolean(bool value)
{
_list.Add(Variant.FromBoolean(value));
}
public override void WriteByte(byte value)
{
_list.Add(Variant.FromByte(value));
}
public override void WriteChar(char ch)
{
_list.Add(Variant.FromChar(ch));
}
public override void WriteDecimal(decimal value)
{
_list.Add(Variant.FromDecimal(value));
}
public override void WriteDouble(double value)
{
_list.Add(Variant.FromDouble(value));
}
public override void WriteSingle(float value)
{
_list.Add(Variant.FromSingle(value));
}
public override void WriteInt32(int value)
{
_list.Add(Variant.FromInt32(value));
}
public override void WriteInt64(long value)
{
_list.Add(Variant.FromInt64(value));
}
public override void WriteSByte(sbyte value)
{
_list.Add(Variant.FromSByte(value));
}
public override void WriteInt16(short value)
{
_list.Add(Variant.FromInt16(value));
}
public override void WriteUInt32(uint value)
{
_list.Add(Variant.FromUInt32(value));
}
public override void WriteUInt64(ulong value)
{
_list.Add(Variant.FromUInt64(value));
}
public override void WriteUInt16(ushort value)
{
_list.Add(Variant.FromUInt16(value));
}
public override void WriteString(string value)
{
if (value == null)
{
_list.Add(Variant.Null);
}
else
{
_list.Add(Variant.FromString(value));
}
}
public override void WriteValue(object value)
{
_list.Add(Variant.FromBoxedObject(value));
}
}
/// <summary>
/// An object reference to reference-id map, that can share base data efficiently.
/// </summary>
......@@ -1029,8 +1041,14 @@ private void WriteObject(object instance)
else
{
// gather instance members by writing them into a list of variants
_memberList.Clear();
typeWriter(_memberWriter, instance);
Debug.Assert(_memberList.Count == 0);
Debug.Assert(!_writingMembers);
_writingMembers = true;
typeWriter(this, instance);
Debug.Assert(_writingMembers);
_writingMembers = false;
// emit object header up front
this.WriteObjectHeader(instance, (uint)_memberList.Count);
......@@ -1041,6 +1059,8 @@ private void WriteObject(object instance)
{
_valueStack.Push(_memberList[i]);
}
_memberList.Clear();
}
}
}
......@@ -1080,7 +1100,7 @@ private static Exception NoSerializationWriterException(string typeName)
/// </summary>
internal static readonly ImmutableArray<Type> s_reverseTypeMap;
static StreamObjectWriter()
static ObjectWriter()
{
s_typeMap = new Dictionary<Type, EncodingKind>
{
......
......@@ -1252,16 +1252,16 @@ public virtual void SerializeTo(Stream stream, CancellationToken cancellationTok
try
{
using (var writer = new StreamObjectWriter(stream, GetSerializationObjectData(), binder: s_defaultBinder, cancellationToken: cancellationToken))
using (var writer = new ObjectWriter(stream, GetSerializationObjectData(), binder: s_defaultBinder, cancellationToken: cancellationToken))
{
writer.WriteValue(this.Green);
}
}
catch (Exception e) when (e is StreamObjectWriter.RecursionDepthExceeded || StackGuard.IsInsufficientExecutionStackException(e))
catch (Exception e) when (e is ObjectWriter.RecursionDepthExceeded || StackGuard.IsInsufficientExecutionStackException(e))
{
stream.Position = start;
using (var writer = new StreamObjectWriter(stream, GetSerializationObjectData(), binder: s_defaultBinder, recursive: false, cancellationToken: cancellationToken))
using (var writer = new ObjectWriter(stream, GetSerializationObjectData(), binder: s_defaultBinder, recursive: false, cancellationToken: cancellationToken))
{
writer.WriteValue(this.Green);
}
......
......@@ -140,7 +140,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
Throw New InvalidOperationException(CodeAnalysisResources.TheStreamCannotBeReadFrom)
End If
Using reader = StreamObjectReader.TryGetReader(stream, knownObjects:=GetDeserializationObjectData(), binder:=s_defaultBinder, cancellationToken:=cancellationToken)
Using reader = ObjectReader.TryGetReader(stream, knownObjects:=GetDeserializationObjectData(), binder:=s_defaultBinder, cancellationToken:=cancellationToken)
If reader Is Nothing Then
Throw New ArgumentException(CodeAnalysisResources.Stream_contains_invalid_data, NameOf(stream))
End If
......
......@@ -21,7 +21,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.UnitTests
root.SerializeTo(stream)
stream.Position = 2
Assert.Equal(expectRecursive, Roslyn.Utilities.StreamObjectReader.IsRecursive(stream))
Assert.Equal(expectRecursive, Roslyn.Utilities.ObjectReader.IsRecursive(stream))
stream.Position = 0
Dim droot = VisualBasicSyntaxNode.DeserializeFrom(stream)
......
......@@ -30,7 +30,7 @@ protected override int GetCount(Data data)
protected override Data TryGetExistingData(Stream stream, Document value, CancellationToken cancellationToken)
{
using (var reader = StreamObjectReader.TryGetReader(stream))
using (var reader = ObjectReader.TryGetReader(stream))
{
if (reader != null)
{
......@@ -53,7 +53,7 @@ protected override Data TryGetExistingData(Stream stream, Document value, Cancel
protected override void WriteTo(Stream stream, Data data, CancellationToken cancellationToken)
{
using (var writer = new StreamObjectWriter(stream, cancellationToken: cancellationToken))
using (var writer = new ObjectWriter(stream, cancellationToken: cancellationToken))
{
writer.WriteString(FormatVersion);
data.TextVersion.WriteTo(writer);
......
......@@ -115,14 +115,14 @@ public void TestSerialization()
var stream = new MemoryStream();
var bloomFilter = new BloomFilter(0.001, false, new[] { "Hello, World" });
using (var writer = new StreamObjectWriter(stream))
using (var writer = new ObjectWriter(stream))
{
bloomFilter.WriteTo(writer);
}
stream.Position = 0;
using (var reader = StreamObjectReader.TryGetReader(stream))
using (var reader = ObjectReader.TryGetReader(stream))
{
var rehydratedFilter = BloomFilter.ReadFrom(reader);
Assert.True(bloomFilter.IsEquivalent(rehydratedFilter));
......
......@@ -31,7 +31,7 @@ protected override int GetCount(Data data)
protected override Data TryGetExistingData(Stream stream, Document value, CancellationToken cancellationToken)
{
using (var reader = StreamObjectReader.TryGetReader(stream))
using (var reader = ObjectReader.TryGetReader(stream))
{
if (reader != null)
{
......@@ -52,7 +52,7 @@ protected override Data TryGetExistingData(Stream stream, Document value, Cancel
protected override void WriteTo(Stream stream, Data data, CancellationToken cancellationToken)
{
using (var writer = new StreamObjectWriter(stream, cancellationToken: cancellationToken))
using (var writer = new ObjectWriter(stream, cancellationToken: cancellationToken))
{
writer.WriteString(FormatVersion);
data.TextVersion.WriteTo(writer);
......
......@@ -140,7 +140,7 @@ private CompilationWithAnalyzers CreateAnalyzerDriver(CompilationWithAnalyzers a
// handling of cancellation and exception
var version = await DiagnosticIncrementalAnalyzer.GetDiagnosticVersionAsync(project, cancellationToken).ConfigureAwait(false);
using (var reader = StreamObjectReader.TryGetReader(stream))
using (var reader = ObjectReader.TryGetReader(stream))
{
Debug.Assert(reader != null,
@"We only ge a reader for data transmitted between live processes.
......
......@@ -127,7 +127,7 @@ private static bool TryReadFrom(Project project, string keyName, out Versions ve
{
using (var storage = service.GetStorage(project.Solution))
using (var stream = storage.ReadStreamAsync(keyName, CancellationToken.None).WaitAndGetResult(CancellationToken.None))
using (var reader = StreamObjectReader.TryGetReader(stream))
using (var reader = ObjectReader.TryGetReader(stream))
{
if (reader != null)
{
......@@ -201,7 +201,7 @@ private static async Task WriteToDependentSemanticVersionAsync(IPersistentStorag
IPersistentStorage storage, string keyName, VersionStamp projectVersion, VersionStamp semanticVersion, CancellationToken cancellationToken)
{
using (var stream = SerializableBytes.CreateWritableStream())
using (var writer = new StreamObjectWriter(stream, cancellationToken: cancellationToken))
using (var writer = new ObjectWriter(stream, cancellationToken: cancellationToken))
{
writer.WriteInt32(SerializationFormat);
projectVersion.WriteTo(writer);
......
......@@ -153,7 +153,7 @@ public async Task RequestAssetAsync(int sessionId, byte[][] checksums, string st
using (Logger.LogBlock(FunctionId.JsonRpcSession_RequestAssetAsync, streamName, _source.Token))
using (var stream = await DirectStream.GetAsync(streamName, _source.Token).ConfigureAwait(false))
{
using (var writer = new StreamObjectWriter(stream))
using (var writer = new ObjectWriter(stream))
{
writer.WriteInt32(sessionId);
......
......@@ -39,7 +39,7 @@ public DiagnosticDataSerializer(VersionStamp analyzerVersion, VersionStamp versi
public async Task<bool> SerializeAsync(object documentOrProject, string key, ImmutableArray<DiagnosticData> items, CancellationToken cancellationToken)
{
using (var stream = SerializableBytes.CreateWritableStream())
using (var writer = new StreamObjectWriter(stream, cancellationToken: cancellationToken))
using (var writer = new ObjectWriter(stream, cancellationToken: cancellationToken))
{
WriteTo(writer, items, cancellationToken);
......@@ -62,7 +62,7 @@ public async Task<StrongBox<ImmutableArray<DiagnosticData>>> DeserializeAsync(ob
using (var storage = persistService.GetStorage(solution))
using (var stream = await ReadStreamAsync(storage, key, documentOrProject, cancellationToken).ConfigureAwait(false))
using (var reader = StreamObjectReader.TryGetReader(stream))
using (var reader = ObjectReader.TryGetReader(stream))
{
if (reader == null)
{
......
......@@ -83,7 +83,7 @@ public Checksum CreateChecksum(MetadataReference reference, CancellationToken ca
public Checksum CreateChecksum(AnalyzerReference reference, CancellationToken cancellationToken)
{
using (var stream = SerializableBytes.CreateWritableStream())
using (var writer = new StreamObjectWriter(stream, cancellationToken: cancellationToken))
using (var writer = new ObjectWriter(stream, cancellationToken: cancellationToken))
{
WriteTo(reference, writer, checksum: true, cancellationToken: cancellationToken);
......@@ -173,7 +173,7 @@ private void WritePortableExecutableReferencePropertiesTo(PortableExecutableRefe
private Checksum CreatePortableExecutableReferenceChecksum(PortableExecutableReference reference, CancellationToken cancellationToken)
{
using (var stream = SerializableBytes.CreateWritableStream())
using (var writer = new StreamObjectWriter(stream, cancellationToken: cancellationToken))
using (var writer = new ObjectWriter(stream, cancellationToken: cancellationToken))
{
WritePortableExecutableReferencePropertiesTo(reference, writer, cancellationToken);
WriteMvidsTo(TryGetMetadata(reference), writer, cancellationToken);
......
......@@ -42,7 +42,7 @@ public override Task WriteObjectToAsync(ObjectWriter writer, CancellationToken c
private static Checksum CreateChecksumFromStreamWriter(string kind, Action<ObjectWriter, CancellationToken> writer)
{
using (var stream = SerializableBytes.CreateWritableStream())
using (var objectWriter = new StreamObjectWriter(stream))
using (var objectWriter = new ObjectWriter(stream))
{
objectWriter.WriteString(kind);
writer(objectWriter, CancellationToken.None);
......@@ -84,7 +84,7 @@ public override Task WriteObjectToAsync(ObjectWriter writer, CancellationToken c
private static Checksum CreateChecksum(AnalyzerReference reference)
{
using (var stream = SerializableBytes.CreateWritableStream())
using (var objectWriter = new StreamObjectWriter(stream))
using (var objectWriter = new ObjectWriter(stream))
{
objectWriter.WriteString(WellKnownSynchronizationKinds.AnalyzerReference);
objectWriter.WriteString(reference.FullPath);
......
......@@ -95,7 +95,7 @@ internal partial class SymbolTreeInfo
// Get the unique key to identify our data.
var key = PrefixMetadataSymbolTreeInfo + prefix + keySuffix;
using (var stream = await storage.ReadStreamAsync(key, cancellationToken).ConfigureAwait(false))
using (var reader = StreamObjectReader.TryGetReader(stream))
using (var reader = ObjectReader.TryGetReader(stream))
{
if (reader != null)
{
......@@ -125,7 +125,7 @@ internal partial class SymbolTreeInfo
if (result != null)
{
using (var stream = SerializableBytes.CreateWritableStream())
using (var writer = new StreamObjectWriter(stream, cancellationToken: cancellationToken))
using (var writer = new ObjectWriter(stream, cancellationToken: cancellationToken))
{
writeObject(writer, result);
stream.Position = 0;
......
......@@ -57,7 +57,7 @@ private static bool TryReadVersion(ObjectReader reader, string formatVersion, ou
// attempt to load from persisted state
using (var storage = persistentStorageService.GetStorage(document.Project.Solution))
using (var stream = await storage.ReadStreamAsync(document, persistenceName, cancellationToken).ConfigureAwait(false))
using (var reader = StreamObjectReader.TryGetReader(stream))
using (var reader = ObjectReader.TryGetReader(stream))
{
if (reader != null)
{
......@@ -88,7 +88,7 @@ private static bool TryReadVersion(ObjectReader reader, string formatVersion, ou
{
using (var storage = persistentStorageService.GetStorage(document.Project.Solution))
using (var stream = SerializableBytes.CreateWritableStream())
using (var writer = new StreamObjectWriter(stream, cancellationToken: cancellationToken))
using (var writer = new ObjectWriter(stream, cancellationToken: cancellationToken))
{
data.WriteVersion(writer, formatVersion);
data.WriteTo(writer);
......@@ -117,7 +117,7 @@ private static async Task<bool> PrecalculatedAsync(Document document, string per
{
using (var storage = persistentStorageService.GetStorage(document.Project.Solution))
using (var stream = await storage.ReadStreamAsync(document, persistenceName, cancellationToken).ConfigureAwait(false))
using (var reader = StreamObjectReader.TryGetReader(stream))
using (var reader = ObjectReader.TryGetReader(stream))
{
if (reader != null)
{
......
......@@ -27,7 +27,7 @@ public static Checksum Create(Stream stream)
public static Checksum Create(string kind, Checksum checksum)
{
using (var stream = SerializableBytes.CreateWritableStream())
using (var writer = new StreamObjectWriter(stream))
using (var writer = new ObjectWriter(stream))
{
writer.WriteString(kind);
checksum.WriteTo(writer);
......@@ -40,7 +40,7 @@ public static Checksum Create<TChecksums>(string kind, TChecksums checksums)
where TChecksums : IEnumerable<Checksum>
{
using (var stream = SerializableBytes.CreateWritableStream())
using (var writer = new StreamObjectWriter(stream))
using (var writer = new ObjectWriter(stream))
{
writer.WriteString(kind);
......@@ -56,7 +56,7 @@ public static Checksum Create<TChecksums>(string kind, TChecksums checksums)
public static Checksum Create<T>(T value, string kind, Serializer serializer)
{
using (var stream = SerializableBytes.CreateWritableStream())
using (var objectWriter = new StreamObjectWriter(stream))
using (var objectWriter = new ObjectWriter(stream))
{
objectWriter.WriteString(kind);
serializer.Serialize(value, objectWriter, CancellationToken.None);
......@@ -67,7 +67,7 @@ public static Checksum Create<T>(T value, string kind, Serializer serializer)
public static Checksum Create(IObjectWritable @object, string kind)
{
using (var stream = SerializableBytes.CreateWritableStream())
using (var objectWriter = new StreamObjectWriter(stream))
using (var objectWriter = new ObjectWriter(stream))
{
objectWriter.WriteString(kind);
@object.WriteTo(objectWriter);
......
......@@ -21,13 +21,13 @@ public static async Task<T> GetValueAsync<T>(this ISolutionSynchronizationServic
var syncObject = service.GetRemotableData(checksum, CancellationToken.None);
using (var stream = SerializableBytes.CreateWritableStream())
using (var writer = new StreamObjectWriter(stream))
using (var writer = new ObjectWriter(stream))
{
// serialize asset to bits
await syncObject.WriteObjectToAsync(writer, CancellationToken.None).ConfigureAwait(false);
stream.Position = 0;
using (var reader = StreamObjectReader.TryGetReader(stream))
using (var reader = ObjectReader.TryGetReader(stream))
{
// deserialize bits to object
var serializer = syncService.Serializer_TestOnly;
......
......@@ -494,12 +494,12 @@ private static async Task VerifyOptionSetsAsync(Workspace workspace, string lang
var asset = assetBuilder.Build(workspace.Options, language, CancellationToken.None);
using (var stream = SerializableBytes.CreateWritableStream())
using (var writer = new StreamObjectWriter(stream))
using (var writer = new ObjectWriter(stream))
{
await asset.WriteObjectToAsync(writer, CancellationToken.None).ConfigureAwait(false);
stream.Position = 0;
using (var reader = StreamObjectReader.TryGetReader(stream))
using (var reader = ObjectReader.TryGetReader(stream))
{
var recovered = serializer.Deserialize<OptionSet>(asset.Kind, reader, CancellationToken.None);
var assetFromStorage = assetBuilder.Build(recovered, language, CancellationToken.None);
......@@ -602,12 +602,12 @@ private async Task<Solution> GetSolutionAsync(ISolutionSynchronizationService se
private static async Task<RemotableData> CloneAssetAsync(Serializer serializer, RemotableData asset)
{
using (var stream = SerializableBytes.CreateWritableStream())
using (var writer = new StreamObjectWriter(stream))
using (var writer = new ObjectWriter(stream))
{
await asset.WriteObjectToAsync(writer, CancellationToken.None).ConfigureAwait(false);
stream.Position = 0;
using (var reader = StreamObjectReader.TryGetReader(stream))
using (var reader = ObjectReader.TryGetReader(stream))
{
var recovered = serializer.Deserialize<object>(asset.Kind, reader, CancellationToken.None);
var assetFromStorage = SolutionAsset.Create(serializer.CreateChecksum(recovered, CancellationToken.None), recovered, serializer);
......
......@@ -547,13 +547,13 @@ public async Task TestSymbolTreeInfoSerialization()
using (var writerStream = new MemoryStream())
{
using (var writer = new StreamObjectWriter(writerStream))
using (var writer = new ObjectWriter(writerStream))
{
info.WriteTo(writer);
}
using (var readerStream = new MemoryStream(writerStream.ToArray()))
using (var reader = StreamObjectReader.TryGetReader(readerStream))
using (var reader = ObjectReader.TryGetReader(readerStream))
{
var readInfo = SymbolTreeInfo.ReadSymbolTreeInfo_ForTestingPurposesOnly(reader);
......
......@@ -42,13 +42,13 @@ public void TestNameSimplificationAnnotationSerialization()
public void VersionStamp_RoundTripText()
{
using (var writerStream = new MemoryStream())
using (var writer = new StreamObjectWriter(writerStream))
using (var writer = new ObjectWriter(writerStream))
{
var versionStamp = VersionStamp.Create();
versionStamp.WriteTo(writer);
using (var readerStream = new MemoryStream(writerStream.ToArray()))
using (var reader = StreamObjectReader.TryGetReader(readerStream))
using (var reader = ObjectReader.TryGetReader(readerStream))
{
var deserializedVersionStamp = VersionStamp.ReadFrom(reader);
......
......@@ -71,7 +71,7 @@ private async Task SerializeDiagnosticResultAsync(string streamName, DiagnosticA
using (RoslynLogger.LogBlock(FunctionId.CodeAnalysisService_SerializeDiagnosticResultAsync, GetResultLogInfo, result, CancellationToken))
using (var stream = await DirectStream.GetAsync(streamName, CancellationToken).ConfigureAwait(false))
{
using (var writer = new StreamObjectWriter(stream))
using (var writer = new ObjectWriter(stream))
{
DiagnosticResultSerializer.Serialize(writer, result, CancellationToken);
}
......
......@@ -56,7 +56,7 @@ private class JsonRpcAssetSource : AssetSource
{
var results = new List<ValueTuple<Checksum, object>>();
using (var reader = StreamObjectReader.TryGetReader(stream))
using (var reader = ObjectReader.TryGetReader(stream))
{
Debug.Assert(reader != null,
@"We only ge a reader for data transmitted between live processes.
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册