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计算为“仅仅是文本”)。Re
BinaryFormatter
:原因很多;它有一个不容忍版本的习惯,它不是跨平台的(例如,即使在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();
        }
    }
}