序列化实体框架对象,保存到文件,读取和DeSerialize

标题应该明确我想要做什么 - 获取Entity Framework对象,将其序列化为字符串,将字符串保存到文件中,然后从文件中加载文本并将其重新串入对象中。 嘿presto!

但当然它不起作用,否则我不会在这里。 当我尝试重新扫描时,我得到一个“输入流不是有效的二进制格式”错误,所以我显然在某处丢失了某些东西。

这是我如何序列化和保存我的数据:

 string filePath = System.Configuration.ConfigurationManager.AppSettings["CustomersLiteSavePath"];
 string fileName = System.Configuration.ConfigurationManager.AppSettings["CustomersLiteFileName"];

        if(File.Exists(filePath + fileName))
        {
            File.Delete(filePath + fileName);
        }

        MemoryStream memoryStream = new MemoryStream();
        BinaryFormatter binaryFormatter = new BinaryFormatter();
        binaryFormatter.Serialize(memoryStream, entityFrameWorkQuery.First());
        string str = System.Convert.ToBase64String(memoryStream.ToArray());

        StreamWriter file = new StreamWriter(filePath + fileName);
        file.WriteLine(str);
        file.Close();

正如你所期望的那样,这给了我一个很大的无意义的文本文件。 然后,我尝试在其他地方重建我的对象:

            CustomerObject = File.ReadAllText(path);

            MemoryStream ms = new MemoryStream();
            FileStream fs = new FileStream(path, FileMode.Open);
            int bytesRead;
            int blockSize = 4096;
            byte[] buffer = new byte[blockSize];

            while (!(fs.Position == fs.Length))
            {
                bytesRead = fs.Read(buffer, 0, blockSize);
                ms.Write(buffer, 0, bytesRead);
            }

            BinaryFormatter formatter = new BinaryFormatter();
            ms.Position = 0;
            Customer cust = (Customer)formatter.Deserialize(ms);

然后我得到二进制格式错误。

我显然很愚蠢。 但是以什么方式?

干杯,马特


当你保存它时,你有(基于你最了解的原因)应用base-64 - 但是你在阅读时没有应用base-64。 国际海事组织,只需完全删除base-64,然后直接写入FileStream 。 这也节省了必须将其缓冲在内存中。

例如:

    if(File.Exists(path))
    {
        File.Delete(path);
    }
    using(var file = File.Create(path)) {
         BinaryFormatter ser = new BinaryFormatter();
         ser.Serialize(file, entityFrameWorkQuery.First());
         file.Close();
    }

     using(var file = File.OpenRead(path)) {
         BinaryFormatter ser = new BinaryFormatter();
         Customer cust = (Customer)ser.Deserialize(file);
         ...
    }     

作为一个附注,您可能会发现DataContractSerializer为EF创建了比BinaryFormatter更好的序列化程序。

链接地址: http://www.djcxy.com/p/4981.html

上一篇: Serialize Entity Framework object, save to file, read and DeSerialize

下一篇: Minimize Cross Edges in a Graph