private object GetValue(object value) { if (value == null) { return(null); } // Check for primitive type. PrimitiveTypeInfo typeInfo = PrimitiveTypeInfo.GetPrimitiveTypeInfo(value.GetType()); if (typeInfo != null) { return(TypeClone.Clone(value)); } // Check if it is instrumentable. IInstrumentable instrumentable = value as IInstrumentable; if (instrumentable != null) { InstrumentationDetails details = new InstrumentationDetails(); instrumentable.Write(details); return(details); } // Return the string. return(value.ToString()); }
private bool WriteInstrumentableParameter(BinaryWriter writer) { // Ask it. IInstrumentable instrumentable = m_value as IInstrumentable; if (instrumentable == null) { return(false); } // Ask it to save its details. InstrumentationDetails details = new InstrumentationDetails(); instrumentable.Write(details); // Write to a stream. IBinarySerializable serializable = details; MemoryStream stream = new MemoryStream(); using (BinaryWriter valueWriter = new BinaryWriter(stream)) { serializable.Write(valueWriter); WriteValueInfo(writer, new ClassInfo(typeof(InstrumentationDetails)), ValueFormat.LinkMeBinary); BinaryWriteAdaptor adaptor = new BinaryWriteAdaptor(writer); adaptor.Write(stream.ToArray()); } return(true); }
private void Write(BinaryWriteAdaptor adaptor, List <InstrumentationEntry> entries) { adaptor.Write(entries.Count); foreach (InstrumentationEntry entry in entries) { // Key. if (entry.Key == null) { adaptor.Write(true); } else { adaptor.Write(false); adaptor.Write(entry.Key); } // Value. if (entry.Value == null) { adaptor.Write(true); } else { adaptor.Write(false); InstrumentationDetails details = entry.Value as InstrumentationDetails; if (details != null) { adaptor.Write(true); Write(adaptor, details.m_entries); } else { adaptor.Write(false); adaptor.Write(entry.Value); } } } }
private void Read(BinaryReadAdaptor adaptor, List <InstrumentationEntry> entries) { int count = adaptor.ReadInt32(); for (int index = 0; index < count; ++index) { string key = null; object value = null; // Key. if (!adaptor.ReadBoolean()) { key = adaptor.ReadString(); } // Value. if (!adaptor.ReadBoolean()) { if (adaptor.ReadBoolean()) { // Details. InstrumentationDetails details = new InstrumentationDetails(); Read(adaptor, details.m_entries); value = details; } else { value = adaptor.ReadObject(); } } entries.Add(new InstrumentationEntry(key, value)); } }