首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将C#对象保存到文件

将C#对象保存到文件
EN

Stack Overflow用户
提问于 2013-02-25 04:45:58
回答 3查看 12.9K关注 0票数 3

我要实现一个不使用数据库的新成员应用程序。我计划创建一个类来定义每个成员,使用字段定义名称、部门等。我希望将这些成员的列表保存到一个文件中(而不是纯文本)。所以我的问题是如何将类对象保存到文件中?

提前感谢:)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-25 04:52:51

我建议进行JSON或XML序列化,然后使用某种算法对内容进行加密。我不会使用二进制序列化,因为当您需要更改程序集版本时,它不是很友好。

我使用下面的代码和Newtonsoft.Json (你可以在NuGet上获得它)来完成这个任务:

代码语言:javascript
运行
复制
using System.IO;
using System.Security.Cryptography;
using System.Text;

using Newtonsoft.Json;

class SecureJsonSerializer<T>
    where T : class
{
    private readonly string filePath;

    private readonly ICryptoTransform encryptor;

    private readonly ICryptoTransform decryptor;

    private const string Password = "some password";

    private static readonly byte[] passwordBytes = Encoding.ASCII.GetBytes(Password);

    public SecureJsonSerializer(string filePath)
    {
        this.filePath = filePath;
        var rmCrypto = GetAlgorithm();
        this.encryptor = rmCrypto.CreateEncryptor();
        this.decryptor = rmCrypto.CreateDecryptor();
    }

    private static RijndaelManaged GetAlgorithm()
    {
        var algorithm = new RijndaelManaged();
        int bytesForKey = algorithm.KeySize / 8;
        int bytesForIV = algorithm.BlockSize / 8;
        algorithm.Key = key.GetBytes(bytesForKey);
        algorithm.IV = key.GetBytes(bytesForIV);
        return algorithm;
    }

    public void Save(T obj)
    {
        using (var writer = new StreamWriter(new CryptoStream(File.Create(this.filePath), this.encryptor, CryptoStreamMode.Write)))
        {
            writer.Write(JsonConvert.SerializeObject(obj));
        }
    }

    public T Load()
    {
        using (var reader = new StreamReader(new CryptoStream(File.OpenRead(this.filePath), this.decryptor, CryptoStreamMode.Read)))
        {
            return JsonConvert.DeserializeObject<T>(reader.ReadToEnd());
        }
    }
}
票数 7
EN

Stack Overflow用户

发布于 2013-02-25 05:09:07

听起来你想要BinaryFormatter。这将保存为不可读的二进制文件。例如,与XmlSerialization相比,它的一个主要优点是您的属性不需要是公共的。

然而,我个人想劝阻你不要这么做。我自己也走过这条路,虽然在短期内很容易,但从长远来看,在这条路上会有很多痛苦。

你会在版本控制方面遇到很多问题。每当你想要更新任何对象(比如,添加一个新属性)时,你必须转换所有的文件。

更糟糕的是,如果您想在同一个应用程序中执行此操作,则需要两个定义同时可用。这导致了荒谬的类定义,例如:

代码语言:javascript
运行
复制
// my original object
class SavedObject
{
    public string Data{get;set}
}

// needed to add a field for last edit
class SavedObject2
{
    public DateTime LastEdit{get;set;}

    public SavedObject2(SavedObject so){}
}

// need a small restructure so we can now have multiple datas
// 'data' is now obsolete
class SavedObject3
{
    public List<string> DataList{get;set;}
    public SavedObject3(SavedObject2 so){}
}

序列化作为持久化的一种方式只在两种情况下是好的。一种是您知道数据在定义上永远不会改变(极其罕见);另一种是您只是以原始方式保存数据(例如,只是一组字符串,然后代码将其转换为类)。

我会认真考虑使用数据库。如果您不喜欢大多数生产数据库附带的管理工作,那么可以考虑使用Sqlite,它很小、可移植,而且很容易嵌入到应用程序中。

票数 2
EN

Stack Overflow用户

发布于 2013-02-25 04:55:36

首先,您可以使用以下工具将类序列化为json:Json Net

第二,从你的偏好中找到任何加密工具,有很多,这里是和例子:Encode to 64

之后,您可以保存您的文件:

代码语言:javascript
运行
复制
    System.File.WriteAllText(@"C:\file.dat","encripted string");
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15056469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档