public override void WriteValueNotExisted(HessianWriter writer, HessianContext context, object value) { Type type = value.GetType(); if (!type.IsArray) { throw Exceptions.UnExpectedTypeException(type); } var elementType = type.GetElementType(); if (elementType == typeof(byte) || elementType == typeof(sbyte)) { GetConverter <BinaryConverter>().WriteValueNotNull(writer, context, value); return; } var array = (Array)value; HessianConverter itemConverter = null; if (elementType == typeof(object)) { //untyped array if (array.Length <= Constants.LIST_DIRECT_MAX) { writer.Write((byte)(Constants.BC_LIST_DIRECT_UNTYPED + array.Length)); } else { writer.Write(Constants.BC_LIST_FIXED_UNTYPED); IntConverter.WriteInt(writer, context, array.Length); } itemConverter = AutoConverter; } else { if (array.Length <= Constants.LIST_DIRECT_MAX) { writer.Write((byte)(Constants.BC_LIST_DIRECT + array.Length)); TypeConverter.WriteType(writer, context, type); } else { writer.Write(Constants.BC_LIST_FIXED); TypeConverter.WriteType(writer, context, type); IntConverter.WriteInt(writer, context, array.Length); } itemConverter = AutoConverter.GetConverter(elementType); } foreach (var item in array) { itemConverter.WriteValue(writer, context, item); } }
public override void WriteValueNotNull(HessianWriter writer, HessianContext context, object value) { (var index, var isNew) = context.ValueRefs.AddItem(value); if (isNew) { WriteValueNotExisted(writer, context, value); } else { writer.Write(Constants.BC_REF); IntConverter.WriteInt(writer, context, index); } }
public void WriteType(HessianWriter writer, HessianContext context, Type type) { if (type == null) { throw new ArgumentNullException(nameof(type)); } (int index, bool isNewItem) = context.TypeRefs.AddItem(type); if (isNewItem) { StringConverter.WriteValueNotNull(writer, context, GetTypeName(type)); } else { IntConverter.WriteInt(writer, context, index); } }
public void WriteClassDefinition(HessianWriter writer, HessianContext context, ClassDefinition definition, out int definitionIndex) { if (definition == null) { throw new ArgumentNullException(nameof(definition)); } (var index, var isNewItem) = context.ClassRefs.AddItem(definition); if (isNewItem) { writer.Write(Constants.BC_OBJECT_DEF); TypeConverter.WriteType(writer, context, definition.Type); IntConverter.WriteInt(writer, context, definition.FieldNames.Count); foreach (var fieldName in definition.FieldNames) { StringConverter.WriteValueNotNull(writer, context, fieldName); } } definitionIndex = index; }