c# – 在.NET 2.0中序列化私有后备数据成员?

我正在编写一个小的xml配置文件,该文件将从特定位置保存和加载(因此不使用user.config).我的应用程序是.NET 2.0,无法移动到更新版本(因此没有DataContractSerializer)我需要实现“保存密码”选项,以便在用户使用应用程序时预先填写密码字段.

目前我就是这样做的

public class UserSettings
{
    //Snip many other properties...

    public bool SavePassword { get; set; }

    [XmlIgnore]
    public string Password
    {
        get
        {
            string retVal = string.Empty;
            if (ProtectedPassword != null)
            {
                try
                {
                    retVal = Encoding.UTF8.GetString(ProtectedData.Unprotect(ProtectedPassword,_md5.ComputeHash(Encoding.UTF8.GetBytes(this.Username.toupper())),DataProtectionScope.LocalMachine));
                }
                catch
                {
                    retVal = string.Empty;
                }
            }
            return retVal;
        }
        set
        {
            ProtectedPassword = ProtectedData.Protect(Encoding.UTF8.GetBytes(value),DataProtectionScope.LocalMachine);
        }
    }

    public byte[] ProtectedPassword;

    private readonly MD5 _md5 = MD5.Create();


    public void Save()
    {
        var xOver = new XmlAttributeOverrides();

        //If Save password is false do not store the encrypted password
        if (this.SavePassword == false)
        {
            var xAttrs = new XmlAttributes();
            xAttrs.XmlIgnore = true;
            xOver.Add(typeof(UserSettings),"ProtectedPassword",xAttrs);
        }

        XmlSerializer xSer = new XmlSerializer(typeof(UserSettings),xOver);
        Directory.CreateDirectory(Path.GetDirectoryName(savePath));
        using(var fs = new FileStream(savePath,FileMode.Create))
        {
            xSer.Serialize(fs,this);
        }

    }

我想使ProtectedPassword不公开,但是如果我将它设置为公共xSer之外的任何东西.Serialize(fs,this)将不包含该属性.我需要做些什么才能使其正常工作?

我知道还有许多其他类似的问题,但是他们都没有.NET 2.0要求并使用限制为2.0的人无法使用的解决方案.除了编写自定义XMLSerarlizer还是生活在ProtectedPassword是公共的这一事实之外,还有其他选择吗?

解决方法

据我所知,在.NET 2.0中完成此操作的唯一方法是编写 IXmlSerializable自定义实现.

也就是说,如果配置文件不需要是人类可读/可编辑的,我建议使用BinaryFormatter执行二进制序列化,这将捕获私有成员.

相关文章

目录简介使用JS互操作使用ClipLazor库创建项目使用方法简单测...
目录简介快速入门安装 NuGet 包实体类User数据库类DbFactory...
本文实现一个简单的配置类,原理比较简单,适用于一些小型项...
C#中Description特性主要用于枚举和属性,方法比较简单,记录...
[TOC] # 原理简介 本文参考[C#/WPF/WinForm/程序实现软件开机...
目录简介获取 HTML 文档解析 HTML 文档测试补充:使用 CSS 选...