コード例 #1
0
    public static byte[] ObjectToByteArray(object obj)
    {
        if (obj == null)
        {
            obj = new NullRepresentative();
        }
        BinaryFormatter bf = new BinaryFormatter();

        using (MemoryStream ms = new MemoryStream())
        {
            bf.Serialize(ms, obj);
            return(ms.ToArray());
        }
    }
コード例 #2
0
        /// <summary>
        /// Serializes an object to a byte array.
        /// </summary>
        /// <param name="obj">The object to serialize.</param>
        /// <returns>A byte-based representation of the object.</returns>
        public virtual byte[] Serialize(object obj)
        {
            if (obj is null)
            {
                obj = new NullRepresentative();
            }

            using (MemoryStream stream = new MemoryStream())
            {
                using (BinaryWriter writer = new BinaryWriter(stream))
                {
                    PowerSerializationContext context = CreateSerializationContext();
                    Type objType = context.RegisterObject(obj).Item2;
                    CheckTypeAllowance(objType);
                    if (objType == typeof(string))
                    {
                        writer.Write((string)obj);
                        long pos = writer.BaseStream.Position;
                        TypeResolver.WriteTypeID(writer, objType);
                        writer.Write((int)(writer.BaseStream.Position - pos));
                    }
                    else if (obj is Type typeRepresentation)
                    {
                        TypeResolver.WriteTypeID(writer, typeRepresentation);
                        long pos = writer.BaseStream.Position;
                        TypeResolver.WriteTypeID(writer, typeof(Type));
                        writer.Write((int)(writer.BaseStream.Position - pos));
                    }
                    else if (objType.IsPrimitive)
                    {
                        WritePrimitiveObject(writer, obj);
                        long pos = writer.BaseStream.Position;
                        TypeResolver.WriteTypeID(writer, objType);
                        writer.Write((int)(writer.BaseStream.Position - pos));
                    }
                    else
                    {
                        if (obj is Array array)
                        {
                            byte rankSize = (byte)array.Rank;
                            writer.Write(rankSize);
                            for (int i = 0; i < array.Rank; i++)
                            {
                                writer.Write(array.GetLength(i));
                            }
                        }
                        for (int i = 1; i < context.ObjectGraph.Count; i++)
                        {
                            SerializeObject(context, writer, context.ObjectGraph[i], context.ObjectGraph[i].GetType());
                        }
                        ImmutableList <Type> types = context.IncludedTypes;
                        long pos = writer.BaseStream.Position;
                        foreach (Type type in types)
                        {
                            TypeResolver.WriteTypeID(writer, type);
                        }
                        writer.Write((int)(writer.BaseStream.Position - pos));
                    }
                    return(stream.ToArray());
                }
            }
        }