Пример #1
0
 private void WriteObject(object instance, BinaryMemberAttribute attribute, Type type, object value)
 {
     if (attribute.Converter == null)
     {
         if (value == null)
         {
             return;
         }
         if (type == typeof(String))
         {
             Write((String)value, attribute.StringFormat);
         }
         else if (type.TryGetEnumerableElementType(out Type elementType))
         {
             foreach (object element in (IEnumerable)value)
             {
                 WriteObject(null, BinaryMemberAttribute.Default, elementType, element);
             }
         }
         else if (type == typeof(Boolean))
         {
             Write((Boolean)value, attribute.BooleanFormat);
         }
         else if (type == typeof(Byte))
         {
             Write((Byte)value);
         }
         else if (type == typeof(DateTime))
         {
             Write((DateTime)value, attribute.DateTimeFormat);
         }
         else if (type == typeof(Decimal))
         {
             Write((Decimal)value);
         }
         else if (type == typeof(Double))
         {
             Write((Double)value);
         }
         else if (type == typeof(Int16))
         {
             Write((Int16)value);
         }
         else if (type == typeof(Int32))
         {
             Write((Int32)value);
         }
         else if (type == typeof(Int64))
         {
             Write((Int64)value);
         }
         else if (type == typeof(SByte))
         {
             Write((SByte)value);
         }
         else if (type == typeof(Single))
         {
             Write((Single)value);
         }
         else if (type == typeof(UInt16))
         {
             Write((UInt16)value);
         }
         else if (type == typeof(UInt32))
         {
             Write((UInt32)value);
         }
         else if (type == typeof(UInt64))
         {
             Write((UInt32)value);
         }
         else if (type.GetTypeInfo().IsEnum)
         {
             WriteEnum(type, value, attribute.Strict);
         }
         else
         {
             WriteCustomObject(type, value, Position);
         }
     }
     else
     {
         // Let a converter do all the work.
         IBinaryConverter converter = BinaryConverterCache.GetConverter(attribute.Converter);
         converter.Write(this, instance, attribute, value);
     }
 }
Пример #2
0
        private static void WriteObject(Stream stream, object instance, BinaryMemberAttribute attribute, Type type,
                                        object value, ByteConverter converter)
        {
            converter = converter ?? ByteConverter.System;

            if (attribute.Converter == null)
            {
                if (value == null)
                {
                    return;
                }
                else if (type == typeof(String))
                {
                    stream.Write((String)value, attribute.StringFormat, converter: converter);
                }
                else if (type.TryGetEnumerableElementType(out Type elementType))
                {
                    foreach (object element in (IEnumerable)value)
                    {
                        WriteObject(stream, null, BinaryMemberAttribute.Default, elementType, element, converter);
                    }
                }
                else if (type == typeof(Boolean))
                {
                    stream.Write((Boolean)value, attribute.BooleanFormat, converter);
                }
                else if (type == typeof(Byte))
                {
                    stream.Write((Byte)value);
                }
                else if (type == typeof(DateTime))
                {
                    stream.Write((DateTime)value, attribute.DateTimeFormat, converter);
                }
                else if (type == typeof(Decimal))
                {
                    stream.Write((Decimal)value);
                }
                else if (type == typeof(Double))
                {
                    stream.Write((Double)value, converter);
                }
                else if (type == typeof(Int16))
                {
                    stream.Write((Int16)value, converter);
                }
                else if (type == typeof(Int32))
                {
                    stream.Write((Int32)value, converter);
                }
                else if (type == typeof(Int64))
                {
                    stream.Write((Int64)value, converter);
                }
                else if (type == typeof(SByte))
                {
                    stream.Write((SByte)value);
                }
                else if (type == typeof(Single))
                {
                    stream.Write((Single)value, converter);
                }
                else if (type == typeof(UInt16))
                {
                    stream.Write((UInt16)value, converter);
                }
                else if (type == typeof(UInt32))
                {
                    stream.Write((UInt32)value, converter);
                }
                else if (type == typeof(UInt64))
                {
                    stream.Write((UInt64)value, converter);
                }
                else if (type.IsEnum)
                {
                    WriteEnum(stream, type, value, attribute.Strict, converter);
                }
                else
                {
                    if (stream.CanSeek)
                    {
                        WriteCustomObject(stream, type, value, stream.Position, converter);
                    }
                    else
                    {
                        WriteCustomObject(stream, type, value, -1, converter);
                    }
                }
            }
            else
            {
                // Let a binary converter do all the work.
                IBinaryConverter binaryConverter = BinaryConverterCache.GetConverter(attribute.Converter);
                binaryConverter.Write(stream, instance, attribute, value, converter);
            }
        }
Пример #3
0
 private object ReadObject(object instance, BinaryMemberAttribute attribute, Type type)
 {
     if (attribute.Converter == null)
     {
         if (type == typeof(String))
         {
             if (attribute.StringFormat == StringDataFormat.Raw)
             {
                 return(ReadString(attribute.Length));
             }
             else
             {
                 return(ReadString(attribute.StringFormat));
             }
         }
         else if (type.IsEnumerable())
         {
             throw new InvalidOperationException("Multidimensional arrays cannot be read directly.");
         }
         else if (type == typeof(Boolean))
         {
             return(ReadBoolean(attribute.BooleanFormat));
         }
         else if (type == typeof(Byte))
         {
             return(ReadByte());
         }
         else if (type == typeof(DateTime))
         {
             return(ReadDateTime(attribute.DateTimeFormat));
         }
         else if (type == typeof(Decimal))
         {
             return(ReadDecimal());
         }
         else if (type == typeof(Double))
         {
             return(ReadDouble());
         }
         else if (type == typeof(Int16))
         {
             return(ReadInt16());
         }
         else if (type == typeof(Int32))
         {
             return(ReadInt32());
         }
         else if (type == typeof(Int64))
         {
             return(ReadInt64());
         }
         else if (type == typeof(SByte))
         {
             return(ReadSByte());
         }
         else if (type == typeof(Single))
         {
             return(ReadSingle());
         }
         else if (type == typeof(UInt16))
         {
             return(ReadUInt16());
         }
         else if (type == typeof(UInt32))
         {
             return(ReadUInt32());
         }
         else if (type == typeof(UInt64))
         {
             return(ReadUInt64());
         }
         else if (type.GetTypeInfo().IsEnum)
         {
             return(ReadEnum(type, attribute.Strict));
         }
         else
         {
             return(ReadCustomObject(type, null, Position));
         }
     }
     else
     {
         // Let a converter do all the work.
         IBinaryConverter converter = BinaryConverterCache.GetConverter(attribute.Converter);
         return(converter.Read(this, instance, attribute));
     }
 }
Пример #4
0
 private static object ReadObject(Stream stream, object instance, BinaryMemberAttribute attribute,
                                  Type type, ByteConverter converter)
 {
     if (attribute.Converter == null)
     {
         if (type == typeof(String))
         {
             if (attribute.StringFormat == StringCoding.Raw)
             {
                 return(stream.ReadString(attribute.Length));
             }
             else
             {
                 return(stream.ReadString(attribute.StringFormat, converter: converter));
             }
         }
         else if (type.IsEnumerable())
         {
             throw new InvalidOperationException("Multidimensional arrays cannot be read directly.");
         }
         else if (type == typeof(Boolean))
         {
             return(stream.ReadBoolean(attribute.BooleanFormat));
         }
         else if (type == typeof(Byte))
         {
             return(stream.Read1Byte());
         }
         else if (type == typeof(DateTime))
         {
             return(stream.ReadDateTime(attribute.DateTimeFormat, converter));
         }
         else if (type == typeof(Decimal))
         {
             return(stream.ReadDecimal());
         }
         else if (type == typeof(Double))
         {
             return(stream.ReadDouble(converter));
         }
         else if (type == typeof(Int16))
         {
             return(stream.ReadInt16(converter));
         }
         else if (type == typeof(Int32))
         {
             return(stream.ReadInt32(converter));
         }
         else if (type == typeof(Int64))
         {
             return(stream.ReadInt64(converter));
         }
         else if (type == typeof(SByte))
         {
             return(stream.ReadSByte());
         }
         else if (type == typeof(Single))
         {
             return(stream.ReadSingle(converter));
         }
         else if (type == typeof(UInt16))
         {
             return(stream.ReadUInt16(converter));
         }
         else if (type == typeof(UInt32))
         {
             return(stream.ReadUInt32(converter));
         }
         else if (type == typeof(UInt64))
         {
             return(stream.ReadUInt64(converter));
         }
         else if (type.IsEnum)
         {
             return(ReadEnum(stream, type, attribute.Strict, converter));
         }
         else
         {
             if (stream.CanSeek)
             {
                 return(ReadCustomObject(stream, type, null, stream.Position, converter));
             }
             else
             {
                 return(ReadCustomObject(stream, type, null, -1, converter));
             }
         }
     }
     else
     {
         // Let a binary converter do all the work.
         IBinaryConverter binaryConverter = BinaryConverterCache.GetConverter(attribute.Converter);
         return(binaryConverter.Read(stream, instance, attribute, converter));
     }
 }