提交 27768b04 编写于 作者: C CyrusNajmabadi

Serialize a guid without an intermediary array allocation.

上级 4902a12a
......@@ -1032,6 +1032,21 @@ private void TestRoundTripChar(Char ch)
TestRoundTrip(ch, (w, v) => w.WriteChar(v), r => r.ReadChar());
}
[Fact]
public void TestRoundTripGuid()
{
TestRoundTripGuid(Guid.Empty);
for (int i = 0; i < 10; i++)
{
TestRoundTripGuid(Guid.NewGuid());
}
}
private void TestRoundTripGuid(Guid guid)
{
TestRoundTrip(guid, (w, v) => w.WriteGuid(v), r => r.ReadGuid());
}
[Fact]
public void TestRoundTripStringCharacters()
{
......
......@@ -124,6 +124,19 @@ public void Dispose()
public ushort ReadUInt16() => _reader.ReadUInt16();
public string ReadString() => ReadStringValue();
public unsafe Guid ReadGuid()
{
Debug.Assert(sizeof(Guid) == 16);
Debug.Assert(sizeof(long) == 8);
Guid guid;
long* pGuid = (long*)&guid;
pGuid[0] = ReadInt64();
pGuid[1] = ReadInt64();
return guid;
}
public object ReadValue()
{
var oldDepth = _recursionDepth;
......
......@@ -119,6 +119,15 @@ public void Dispose()
public void WriteUInt16(ushort value) => _writer.Write(value);
public void WriteString(string value) => WriteStringValue(value);
public unsafe void WriteGuid(Guid guid)
{
Debug.Assert(sizeof(Guid) == 16);
Debug.Assert(sizeof(long) == 8);
long* pGuid = (long*)&guid;
WriteInt64(pGuid[0]);
WriteInt64(pGuid[1]);
}
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.");
......
......@@ -234,7 +234,7 @@ private void WriteAnalyzerFileReferenceMvid(AnalyzerFileReference reference, Obj
var mvidHandle = metadataReader.GetModuleDefinition().Mvid;
var guid = metadataReader.GetGuid(mvidHandle);
writer.WriteValue(guid.ToByteArray());
writer.WriteGuid(guid);
}
}
catch
......@@ -312,7 +312,7 @@ private void WriteMvidTo(ModuleMetadata metadata, ObjectWriter writer, Cancellat
var mvidHandle = metadataReader.GetModuleDefinition().Mvid;
var guid = metadataReader.GetGuid(mvidHandle);
writer.WriteValue(guid.ToByteArray());
writer.WriteGuid(guid);
}
private void WritePortableExecutableReferenceTo(
......
......@@ -102,7 +102,7 @@ void IObjectWritable.WriteTo(ObjectWriter writer)
{
ProjectId.WriteTo(writer);
writer.WriteValue(Id.ToByteArray());
writer.WriteGuid(Id);
writer.WriteString(DebugName);
}
......@@ -110,7 +110,7 @@ internal static DocumentId ReadFrom(ObjectReader reader)
{
var projectId = ProjectId.ReadFrom(reader);
var guid = new Guid((byte[])reader.ReadValue());
var guid = reader.ReadGuid();
var debugName = reader.ReadString();
return CreateFromSerialized(projectId, guid, debugName);
......
......@@ -86,13 +86,13 @@ public override int GetHashCode()
void IObjectWritable.WriteTo(ObjectWriter writer)
{
writer.WriteValue(Id.ToByteArray());
writer.WriteGuid(Id);
writer.WriteString(DebugName);
}
internal static ProjectId ReadFrom(ObjectReader reader)
{
var guid = new Guid((byte[])reader.ReadValue());
var guid = reader.ReadGuid();
var debugName = reader.ReadString();
return CreateFromSerialized(guid, debugName);
......
......@@ -83,13 +83,13 @@ public override int GetHashCode()
void IObjectWritable.WriteTo(ObjectWriter writer)
{
writer.WriteValue(Id.ToByteArray());
writer.WriteGuid(Id);
writer.WriteString(DebugName);
}
internal static SolutionId ReadFrom(ObjectReader reader)
{
var guid = new Guid((byte[])reader.ReadValue());
var guid = reader.ReadGuid();
var debugName = reader.ReadString();
return CreateFromSerialized(guid, debugName);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册