public Serialize ( bool &hasMetaData, object obj ) : ByteBuffer | ||
hasMetaData | bool | |
obj | object | |
Результат | ByteBuffer |
public ByteBuffer Serialize(out bool hasMetaData, object obj)
{
if (obj == null)
{
hasMetaData = false;
_writer.WriteUInt8(0); // null
return _writer.GetDataAndRewind();
}
_newTypeFound = false;
StoreObject(obj);
_visited.Clear();
if (!_newTypeFound)
{
// No unknown metadata found - to be optimistic pays off
hasMetaData = false;
return _writer.GetDataAndRewind();
}
StoreNewDescriptors(obj);
if (_typeOrDescriptor2InfoNew.Count > 0)
{
_writer.GetDataAndRewind();
if (MergeTypesByShapeAndStoreNew())
{
_typeOrDescriptor2InfoNew.Clear();
_visited.Clear();
hasMetaData = true;
return _writer.GetDataAndRewind();
}
_typeOrDescriptor2InfoNew.Clear();
}
_visited.Clear();
_newTypeFound = false;
StoreObject(obj);
if (_newTypeFound)
{
throw new BTDBException("Forgot descriptor or type");
}
_visited.Clear();
hasMetaData = false;
return _writer.GetDataAndRewind();
}
public void SerializationRunsAndDoesNotLeak1Byte() { var serializer = new EventSerializer(); bool hasMetadata; var meta = serializer.Serialize(out hasMetadata, new User()); serializer.ProcessMetadataLog(meta); long baselineMemory = 0; for (int i = 0; i < 100; i++) { serializer.Serialize(out hasMetadata, new User()); Assert.False(hasMetadata); if (i == 2) { GC.Collect(2); GC.WaitForPendingFinalizers(); GC.Collect(2); baselineMemory = GC.GetTotalMemory(false); } } GC.Collect(2); GC.WaitForPendingFinalizers(); GC.Collect(2); Assert.InRange(GC.GetTotalMemory(false), 0, baselineMemory+400); }