我试图在 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<Transaction>" 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] 删除。
我来说两句