C#将通用列表序列化为文件
我有一个类,其中包含有关图片的信息,如filepath,hashvalue,bytes。 在另一个类中,我得到了一个通用列表,其中我放置了包含图片信息的类中的对象。
该类看起来像这样:
[Serializable()] class PicInfo : ISerializable { public string fileName { get; set; } public string completeFileName { get; set; } public string filePath { get; set; } public byte[] hashValue { get; set; } public PicInfo() { } public PicInfo(SerializationInfo info, StreamingContext ctxt) { this.fileName = (string)info.GetValue("fileName", typeof(string)); this.completeFileName = (string)info.GetValue("completeFileName", typeof(string)); this.filePath = (string)info.GetValue("filePath", typeof(string)); this.hashValue = (byte[])info.GetValue("hashValue", typeof(byte[])); } public void GetObjectData(SerializationInfo info, StreamingContext ctxt) { info.AddValue("fileName", this.fileName); info.AddValue("completeFileName", this.completeFileName); info.AddValue("filePath", this.filePath); info.AddValue("hashValue", this.hashValue); } }
我的列表只是list pi = new list();
序列化这个列表最简单的方法是什么?
如果你想使用BinaryFormatter
(我真的不建议),你可以使用:
[Serializable] class PicInfo { public string fileName { get; set; } public string completeFileName { get; set; } public string filePath { get; set; } public byte[] hashValue { get; set; } public PicInfo() { } } static class Program { static void Main() { List pi = new List (); pi.Add(new PicInfo {fileName = "foo.bar", hashValue = new byte[] {1, 2, 3}}); var ser = new BinaryFormatter(); using (var ms = new MemoryStream()) { ser.Serialize(ms, pi); var bytes = ms.ToArray(); } } }
如果你想使用XmlSerializer
(可能更喜欢IMO),但需要byte[]
,那么:
public class PicInfo { public string fileName { get; set; } public string completeFileName { get; set; } public string filePath { get; set; } public byte[] hashValue { get; set; } public PicInfo() { } } static class Program { static void Main() { List pi = new List (); pi.Add(new PicInfo {fileName = "foo.bar", hashValue = new byte[] {1, 2, 3}}); var ser = new XmlSerializer(typeof(List )); using (var ms = new MemoryStream()) { ser.Serialize(ms, pi); var bytes = ms.ToArray(); } } }
就个人而言,我使用protobuf-net:
[ProtoContract] public class PicInfo { [ProtoMember(1)]public string fileName { get; set; } [ProtoMember(2)]public string completeFileName { get; set; } [ProtoMember(3)]public string filePath { get; set; } [ProtoMember(4)]public byte[] hashValue { get; set; } public PicInfo() { } } static class Program { static void Main() { List pi = new List (); pi.Add(new PicInfo {fileName = "foo.bar", hashValue = new byte[] {1, 2, 3}}); using (var ms = new MemoryStream()) { Serializer.Serialize(ms, pi); var bytes = ms.ToArray(); } } }
尺寸:
-
BinaryFormatter
:488个字节 -
XmlSerializer
:251个字节 - protobuf-net:16个字节