我有一系列从内部SQLite数据库收集数据的类。典型的一个看起来像这样
public class foo
{
[AutoIncrement, XmlIgnore, PrimaryKey]
public int tid {get; private set;}
[XmlIgnore]
public string barID {get;set;}
public string someData {get;set;}
[Ignore]
public List<bar> Bar {private set{}; get {return myApp.Singleton.DBManager.GetListOfObjects<bar>("id", barID); }}
}
public class bar
{
[AutoIncrement, PrimaryKey, XmlIgnore]
public int tid {get;private set;}
public string id {get;set;}
[XmlIgnore]
public string barTwoID {get;set;}
public bool isSet {get;set;}
[Ignore]
public barTwo BarTwo {private set{}; get {return myApp.Singleton.DBManager.GetSingleObject<barTwo>("id", barTwoID);}}
}
(你明白了)
我在应用程序期间填写了类,在保存到文件之前,当我在调试器中查看foo时,所有数据都出现了(我的意思是,bar和barTwo正确填充)。
我将foo传递给我的序列化程序,但是当我检查输出文件时,无法保证我之前看到的所有数据都在输出文件中。
我的序列化器看起来像这样
static BackgroundWorker bgWorker = new BackgroundWorker();
public static void CreateSchema<T>(T schema, string id, string type, bool dump = false) where T:IDatabase, new()
{
try
{
bgWorker.DoWork += async (object sender, DoWorkEventArgs e) =>
{
var emptyNs = new XmlSerializerNamespaces(new[] { XmlQualifiedName.Empty });
var filename = Path.Combine(TechApp2.Singleton.ContentDirectory,
string.Format("{0}-{1}.xml", typeof(job).ToString(), id));
var serializer = new XmlSerializer(typeof(T));
using (var writer = new StreamWriter(filename))
serializer.Serialize(writer, schema, emptyNs);
await Torrent.CopyAndMove(filename, dump);
await SendEmail.SendEmailOut(filename, type, id);
};
bgWorker.RunWorkerAsync();
}
catch (Exception ex)
{
Console.WriteLine("Exception thrown - {0}:{1}", ex.Message, ex.InnerException);
}
}
T schema
(在这种情况下)是foo - 它被设计为几乎任何东西。
根据我的阅读,private set{}
之类的List<bar> Bar{...}
需要让序列化程序在序列化输出中显示这些链接类。我也读过这个作品,但并不总是最好的方法,但很少有人解释如何使它更健壮。
任何有关这方面的建议都会受到赞赏,因为它引起了我的争论,为什么有时一切都在那里(在文件中),有时它不是。
在课程之前添加[Serializable]
似乎没有什么区别