C#序列化通用列表<;customObject>;归档
我有一个类,它保存有关图片的信息,比如文件路径、哈希值、字节。 在另一个类中,我得到了一个通用列表,其中我放置了保存图片信息的类中的对象 该类如下所示:C#序列化通用列表<;customObject>;归档,c#,serialization,generic-list,C#,Serialization,Generic List,我有一个类,它保存有关图片的信息,比如文件路径、哈希值、字节。 在另一个类中,我得到了一个通用列表,其中我放置了保存图片信息的类中的对象 该类如下所示: [Serializable()] class PicInfo : ISerializable { public string fileName { get; set; } public string completeFileName { get; set; } public str
[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()代码>
序列化此列表的最佳方法是什么?如果要使用二进制格式化程序(我不建议这样做),可以使用:
[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<PicInfo> pi = new List<PicInfo>();
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();
}
}
}
就我个人而言,我会使用protobuf网络:
[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<PicInfo> pi = new List<PicInfo>();
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();
}
}
}
[协议]
公共类PicInfo
{
[ProtoMember(1)]公共字符串文件名{get;set;}
[ProtoMember(2)]公共字符串completeFileName{get;set;}
[ProtoMember(3)]公共字符串文件路径{get;set;}
[ProtoMember(4)]公共字节[]哈希值{get;set;}
公共PicInfo(){}
}
静态类程序
{
静态void Main()
{
列表pi=新列表();
添加(新的PicInfo{fileName=“foo.bar”,hashValue=newbyte[]{1,2,3});
使用(var ms=new MemoryStream())
{
Serializer.Serialize(ms,pi);
var bytes=ms.ToArray();
}
}
}
尺寸:
二进制格式化程序
:488字节
XmlSerializer
:251字节
- 协议网络:16字节
你应该进一步澄清你的问题。您想要什么序列化格式?人类可读?二元的?请提供更多信息,无需使用ISerializable即可正常工作。NET可以将其全部序列化以方便使用。?格式应为二进制,很抱歉没有告诉您。@mtijn不正确;这只适用于XmlSerializer
@Yustme如果您使用的是BinaryFormatter
(我假设您是),那么无论您是否实现iseralizable
,它都将是二进制的。我强烈建议不要实现ISerializable
,除非您有充分的理由(但是:我也强烈建议不要首先使用BinaryFormatter
;p)嗨,它不应该是xml文件,而应该是txt文件。顺便说一句,你能解释一下为什么不能使用binaryformatter吗?@Yustme很少有序列化程序会编写“一个txt文件”——它们会被格式化;也许是定制的二进制文件,也许是xml,也许是json——但永远不要“仅仅是一个txt文件”(除非您将xml或json计算为“仅仅是文本”)。ReBinaryFormatter
:原因很多;它有一个不容忍版本的习惯,它不是跨平台的(例如,即使在Silverlight上也没用),它速度慢,并且输出过多。即使是无形的改变,如使某些东西成为自动实现的属性,也会破坏它。哦,它往往通过事件吸入不需要的物体。我明白了。我还有一个问题,我能再反序列化一次吗?@Yustme绝对!(顺便说一句,如果要写入磁盘,您可以在这里用文件流
替换内存流
)。使用MemoryStream
只需将位置设置回0。使用FileStream
只需File.OpenRead(path)
即可获得流。
[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<PicInfo> pi = new List<PicInfo>();
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();
}
}
}