代码之家  ›  专栏  ›  技术社区  ›  Matt

在c中,如何将列表<int>序列化为字节[],以便将其存储在db字段中?

  •  4
  • Matt  · 技术社区  · 14 年前

    在c中,我如何序列化 List<int> 到A byte[] 以便将其存储在数据库字段中?

    我知道如何序列化到磁盘上的文件,但如何序列化到变量?

    下面是我如何序列化到磁盘的:

                List<int> l = IenumerableofInts.ToList();
                Stream s = File.OpenWrite("file.bin");
                BinaryFormatter bf = new BinaryFormatter();
                bf.Serialize(s, lR);
                s.Close();
    

    我肯定这和以前差不多,但我就是不能把脑袋绕过去。

    4 回复  |  直到 14 年前
        1
  •  8
  •   Oded    14 年前

    使用A MemoryStream 而不是文件流:

    Stream s = new MemoryStream();
    

    这将把数据放在 s 变量,以后可以在应用程序中读取。

    为了读取它,您需要设置 Position 到0,因此查找将从流的开头开始(如果以块读取),或使用 ToArray() 在上面检索完整的内容。

        2
  •  3
  •   Powerlord    14 年前

    直截了当地说:我会把它们放在数据库中的另一个表中,该表与其父记录有一对多的外键关系。

    这样,就可以对它们执行常规的db操作,比如根据子表中的int来检索父记录。

        3
  •  1
  •   Marc Gravell    14 年前

    就我个人而言 使用 BinaryFormatter 为此目的-它是特定于实现的,而且过于昂贵。我想(其中之一):

    1:使用 BinaryWriter / BinaryReader 要手动执行此操作(但请注意,这很容易从任何api解释):

        // note I've used arrays in the example; lists are identical
        int[] data = { 1, 2, 3, 4, 5 };
        byte[] raw;
        using (var ms = new MemoryStream())
        using (var writer = new BinaryWriter(ms))
        {
            writer.Write(data.Length);
            foreach(int i in data) {
                writer.Write(i);
            }
            writer.Close();
            raw = ms.ToArray();
        }
        // read it back
        using (var ms = new MemoryStream(raw))
        using (var reader = new BinaryReader(ms))
        {
            int count = reader.ReadInt32();
            data = new int[count];
            for (int i = 0; i < count; i++)
            {
                data[i] = reader.ReadInt32();
            }
        }
    

    或者2:使用与实现无关的序列化格式,比如protobuf;这里我使用protobuf net

        int[] data = { 1, 2, 3, 4, 5 };
        byte[] raw;
        using (var ms = new MemoryStream()) {
            Serializer.Serialize(ms, data);
            raw = ms.ToArray();
        }
        // read it back
        using (var ms = new MemoryStream(raw)) {
            data = Serializer.Deserialize<int[]>(ms);
        }
    

    注意(1)使用24字节作为示例(6*4字节);(2)使用10字节(部分原因是数字很简单,但实际上protobuf有一些技巧(例如“打包”数据),我们甚至不在这里使用)。

        4
  •  0
  •   Raj Kaimal    14 年前

    使用泛型序列化程序

    private static string SerializeObject<T>(T source)
    {
        var serializer = new XmlSerializer(typeof(T));
    
        using (var sw = new System.IO.StringWriter())
        using (var writer = new XmlTextWriter(sw))
        {
            serializer.Serialize(writer, source);
            return sw.ToString();
        }
    }
    

    http://weblogs.asp.net/rajbk/archive/2009/10/04/xmlserializer-and-invalid-xml.aspx