在 Visual Studio for C# 中使用自定义类列表作为持久设置

用户7359083

我试图在 C# 中创建一个项目,用户在其中输入他们的预算信息以及他们的交易(记录金额和类别以确定他们是否低于或超过预算)。

我有一个自定义事务类:

class Transaction
{
    private int id;
    private int year;
    private int month;
    private int day;
    private string memo;
    private string category;
    private decimal amount;

    public Transaction(int tranid, int tranyear, int tranmonth, int tranday, 
        string tranmemo, string trancategory, decimal tranamount)
    {
        id = tranid;
        year = tranyear;
        month = tranmonth;
        day = tranday;
        memo = tranmemo;
        category = trancategory;
        amount = tranamount;
    }
}

在整个项目中,我决定尝试使用 Visual Studio 中包含的内置持久设置功能来创建“事务”类型的 List 对象,如下所示。

<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="Budget.Properties" GeneratedClassName="Settings">
  <Profiles />
  <Settings>
    <Setting Name="transactions" Type="System.Collections.Generic.List&lt;Transaction&gt;" Scope="User">
      <Value Profile="(Default)" />
    </Setting>
  </Settings>

由于默认情况下未初始化 List 对象 - 在 main 内部,我使用:

Properties.Settings.Default.transactions = new List<Budget.Transaction>();

Properties.Settings.Default.transactions.Add(
    new Transaction(1, 2017, 7, 27, "Birthday transaction", "Parties", 100.00m));

Properties.Settings.Default.Save();

它初始化对象并允许我完美地写入和读取列表项。此时一切正常。保存持久设置时会出现此问题。当列表属于自定义类类型时,我已将问题隔离开来。当 List 是字符串类型时,它可以轻松正确地保存。

尝试将设置保存在 user.config 文件中:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <configSections>
        <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
            <section name="Budget.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
        </sectionGroup>
    </configSections>
    <userSettings>
        <Budget.Properties.Settings>
            <setting name="transactions" serializeAs="Xml">
                <value />
            </setting>
        </Budget.Properties.Settings>
    </userSettings>
</configuration>

最后,我的问题是......是否有可能做到这一点?是否可以使用内置的持久设置功能来保存具有自定义类类型的 List 对象?还是仅在使用内置数据类型(如 string 或 int)时才可行?

醉码猴

您遇到的问题是您的事务对象不可序列化。为了将交易细节保存在文件中,您必须更改您的类以公开公共属性,而不是私有字段。我不确定您是否也需要将该类标记为可序列化,我认为它应该只通过拥有公共属性就可以工作。

public class Transaction
{
    public int id { get; set; }
    public int year { get; set; }
    public int month { get; set; }
    public int day { get; set; }
    public string memo { get; set; }
    public string category { get; set; }
    public decimal amount { get; set; }
}

编辑:检查后,拥有公共字段也可以

可以序列化的项目

  • 可以使用 XmLSerializer 类序列化以下项目:
  • 公共读/写属性和公共类的字段。
  • 实现 ICollection 或 IEnumerable 的类。
    • 只有集合被序列化,而不是公共属性。
  • XmlElement 对象。
  • XmlNode 对象。
  • 数据集对象。

然而...

这并不是放置交易数据的最佳位置。您可以使用相同的技术(序列化为 XML)并将它们保存到单独的文件中,或者使用正确的方式来存储此类数据,即数据库。我强烈建议您使用 Linq to SQL。您可以在此处阅读有关如何创建数据库以及如何使用 Linq to SQL 的信息它本质上是一个轻量级的实体框架。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章