如何对一个变量进行序列化

4
以下代码示例展示了如何将对象序列化/反序列化到文件中。我该如何修改这个代码以将对象序列化到一个变量而不是文件中?(假设这个变量会被传递给读/写方法,而不是文件名)。
    public static void WriteObject(string fileName)
    {
        Console.WriteLine(
            "Creating a Person object and serializing it.");
        Person p1 = new Person("Zighetti", "Barbara", 101);
        FileStream writer = new FileStream(fileName, FileMode.Create);
        DataContractSerializer ser =
            new DataContractSerializer(typeof(Person));
        ser.WriteObject(writer, p1);
        writer.Close();
    }

    public static void ReadObject(string fileName)
    {
        Console.WriteLine("Deserializing an instance of the object.");
        FileStream fs = new FileStream(fileName,
        FileMode.Open);
        XmlDictionaryReader reader =
            XmlDictionaryReader.CreateTextReader(fs, new XmlDictionaryReaderQuotas());
        DataContractSerializer ser = new DataContractSerializer(typeof(Person));

        // Deserialize the data and read it from the instance.
        Person deserializedPerson =
            (Person)ser.ReadObject(reader, true);
        reader.Close();
        fs.Close();
        Console.WriteLine(String.Format("{0} {1}, ID: {2}",
        deserializedPerson.FirstName, deserializedPerson.LastName,
        deserializedPerson.ID));
    }

你想传递什么类型的变量?字符串?MemoryStream? - Kibbee
你想要什么类型的变量?byte[] - svick
p1 是一个变量,它可以保存你想要的任何内容。 - H H
其实,还有一件事情我希望能够得到建议。在这种情况下,我只是想复制我的对象。我将立即将它反序列化为一个变量,这个变量就是副本。我知道我可以实现 ICloneable,但我必须使用序列化,所以我想我可以重用那段代码。(显然,这只是我从 Microsoft 上借用的一个例子,我的真实代码将序列化任意数量的不同类型)。 - Brandon Moore
@HenkHolterman 谢谢您指出显而易见的事情 ;) - Brandon Moore
1个回答

8
你可以将 FileStream 更改为内存流,并将其转储到 byte[] 中。
public static byte[] WriteObject<T>(T thingToSave)
{
    Console.WriteLine("Serializing an instance of the object.");
    byte[] bytes;
    using(var stream = new MemoryStream())
    {
        var serializer = new DataContractSerializer(typeof(T));
        serializer.WriteObject(stream, thingToSave);
        bytes = new byte[stream.Length];
        stream.Position = 0;
        stream.Read(bytes, 0, (int)stream.Length);
    }
    return bytes;

}

public static T ReadObject<T>(byte[] data)
{
    Console.WriteLine("Deserializing an instance of the object.");

    T deserializedThing = default(T);

    using(var stream = new MemoryStream(data))
    using(var reader = XmlDictionaryReader.CreateTextReader(stream, new XmlDictionaryReaderQuotas()))
    {
        var serializer = new DataContractSerializer(typeof(T));

        // Deserialize the data and read it from the instance.
        deserializedThing = (T)serializer.ReadObject(reader, true);
    }
    return deserializedThing;
}

你认为使用MemoryStream会更好还是更差? - Brandon Moore
使用byte[]缓冲区比使用它更好还是更差? - Brandon Moore
1
我认为MemoryStream是实现了Streambyte[]缓冲区。 - scottm
只有一个问题:为什么需要设置stream.Position = 0?它不会默认为0吗? - Brandon Moore

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接