我要在不使用数据库的情况下实现新的成员应用程序。我打算创建一个类来定义每个成员,使用定义名称,部门等的字段。我希望将这些成员的列表保存到文件中(不是纯文本)。所以我的问题是如何将类对象保存到文件中?
提前致谢:)
答案 0 :(得分:7)
我建议做JSON或XML序列化,然后用一些算法加密内容。我不会选择二进制序列化,因为当你需要更改程序集版本时它不是很友好。
我正在使用以下代码和Newtonsoft.Json(您可以在NuGet上获取它)来实现此目的:
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());
}
}
}
答案 1 :(得分:2)
听起来你想要BinaryFormatter。这将保存为不可读的二进制文件。与XmlSerialization(例如)相比,它的一个主要好处是您的属性不需要公开。
但我个人想劝阻你不要这个想法。我自己一直走在这条路上,虽然在短期内很容易,但从长远来看,路上会有很多痛苦。
版本控制会遇到很多问题。每当您想要更新任何对象(例如,添加新属性)时,您必须转换所有文件
更糟糕的是,如果您想在同一个应用程序中执行此操作,则需要同时提供这两个定义。这导致了荒谬的类定义,例如:
// 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 :(得分:0)
首先,您可以使用此工具将您的班级序列化为json:Json Net
其次从您的偏好中找到任何加密工具,有很多,这里有例子:Encode to 64
之后您可以保存文件:
System.File.WriteAllText(@"C:\file.dat","encripted string");