提交 fefcc593 编写于 作者: C CyrusNajmabadi 提交者: GitHub

Merge pull request #20790 from CyrusNajmabadi/guidSerialization

Serialize a guid without an intermediary array allocation.
......@@ -1032,6 +1032,24 @@ private void TestRoundTripChar(Char ch)
TestRoundTrip(ch, (w, v) => w.WriteChar(v), r => r.ReadChar());
}
[Fact]
public void TestRoundTripGuid()
{
TestRoundTripGuid(Guid.Empty);
TestRoundTripGuid(new Guid(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1));
TestRoundTripGuid(new Guid(0b10000000000000000000000000000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1));
TestRoundTripGuid(new Guid(0b10000000000000000000000000000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0));
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,17 @@ public void Dispose()
public ushort ReadUInt16() => _reader.ReadUInt16();
public string ReadString() => ReadStringValue();
public Guid ReadGuid()
{
var accessor = new ObjectWriter.GuidAccessor
{
Low64 = ReadInt64(),
High64 = ReadInt64()
};
return accessor.Guid;
}
public object ReadValue()
{
var oldDepth = _recursionDepth;
......
......@@ -119,6 +119,28 @@ public void Dispose()
public void WriteUInt16(ushort value) => _writer.Write(value);
public void WriteString(string value) => WriteStringValue(value);
/// <summary>
/// Used so we can easily grab the low/high 64bits of a guid for serialization.
/// </summary>
[StructLayout(LayoutKind.Explicit)]
internal struct GuidAccessor
{
[FieldOffset(0)]
public Guid Guid;
[FieldOffset(0)]
public long Low64;
[FieldOffset(8)]
public long High64;
}
public void WriteGuid(Guid guid)
{
var accessor = new GuidAccessor { Guid = guid };
WriteInt64(accessor.Low64);
WriteInt64(accessor.High64);
}
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.
先完成此消息的编辑!
想要评论请 注册