我正在尝试将类转换为字节但不起作用。
我收到一个长度为零的字节[](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;
}
}
答案 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);