对象到字节不起作用

时间:2010-08-08 16:55:41

标签: c#

我正在尝试将类转换为字节但不起作用。

我收到一个长度为零的字节[](b)。为什么?

void start()
{

    Item item = new Item();
    item.files.Add(@"test");
    byte[] b = ObjectToByteArray(item);  // b will have zero length 

}


    [Serializable]
    public class Item : ISerializable
    {
        public Item()
        {
            files = new List<string>();
            Exclude = false;
            CleanEmptyFolder = false;
        }
        public List<string> files;
        public string MusicProfileName;
        public bool Exclude;

        #region ISerializable Members

        public void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            info.AddValue("files", files);
            info.AddValue("MusicProfileName", MusicProfileName);
            info.AddValue("Exclude", Exclude);
        }

        #endregion
    }

    public byte[] ObjectToByteArray(object _Object)
    {
        using (var stream = new MemoryStream())
        {
            // serialize object 
            var formatter = new BinaryFormatter();
            formatter.Serialize(stream, _Object);

            // get a byte array
            var bytes = new byte[stream.Length];
            using (BinaryReader br = new BinaryReader(stream))
            {
                bytes = br.ReadBytes(Convert.ToInt32(stream.Length));
            }

            return bytes;
        }

    }

2 个答案:

答案 0 :(得分:4)

在您开始阅读之前,您没有重置MemoryStream。该位置位于流的末尾,因此您将获得一个空数组。

使用ToArray方法,无论当前位置如何,它都会获得整个内容:

public byte[] ObjectToByteArray(object _Object) {

  using (var stream = new MemoryStream()) {

    // serialize object 
    var formatter = new BinaryFormatter();
    formatter.Serialize(stream, _Object);

    // get a byte array
    return stream.ToArray();
  }

}

答案 1 :(得分:3)

尝试使用MemoryStream.ToArray而不是尝试使用BinaryReader从MemoryStream中读取:

return stream.ToArray();

问题是你没有重置流,所以它试图从结束而不是从头开始阅读。你也可以回到流的开头:

stream.Seek(0, SeekOrigin.Begin);