C# 序列化数据不总是输出到文件

C# 序列化数据不总是输出到文件,c#,serialization,C#,Serialization,我有一系列从内部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

我有一系列从内部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);}}
 }
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);
        }
    }
公共类foo
{
[自动递增、XmlIgnore、PrimaryKey]
public int tid{get;private set;}
[XmlIgnore]
公共字符串barID{get;set;}
公共字符串someData{get;set;}
[忽略]
公共列表栏{private set{};get{return myApp.Singleton.DBManager.GetListOfObjects(“id”,barID);}
}
公共类酒吧
{
[自动递增,主密钥,XmlIgnore]
public int tid{get;private set;}
公共字符串id{get;set;}
[XmlIgnore]
公共字符串barTwoID{get;set;}
公共布尔值集{get;set;}
[忽略]
public barTwo barTwo{private set{};get{return myApp.Singleton.DBManager.GetSingleObject(“id”,barTwoID);}
}
(你明白了)

我在应用程序中填充类,在保存到文件之前,当我在调试器中查看foo时,所有数据都会出现(我的意思是,bar和barTwo被正确填充)

我将foo传递给我的serialiser,但是当我检查输出文件时,不能保证我前面看到的所有数据都在输出文件中

我的序列化程序看起来像这样

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);}}
 }
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);
        }
    }
static BackgroundWorker bgWorker=new BackgroundWorker();
公共静态void CreateSchema(T schema,string id,string type,bool dump=false),其中T:IDatabase,new()
{
尝试
{
bgWorker.DoWork+=异步(对象发送方,DoWorkEventArgs e)=>
{
var emptyNs=新的XmlSerializerNamespaces(新[]{XmlQualifiedName.Empty});
var filename=Path.Combine(TechApp2.Singleton.ContentDirectory,
Format(“{0}-{1}.xml”,typeof(job.ToString(),id));
var serializer=newxmlserializer(typeof(T));
使用(var writer=newstreamwriter(文件名))
serializer.Serialize(writer、schema、emptyNs);
等待Torrent.CopyAndMove(文件名,转储);
等待SendEmail.SendEmailOut(文件名、类型、id);
};
bgWorker.RunWorkerAsync();
}
捕获(例外情况除外)
{
WriteLine(“抛出的异常-{0}:{1}”,例如Message,例如InnerException);
}
}
T schema
(在本例中)是foo-它被设计成可以接受任何东西

从我所读到的内容来看,需要
列表栏{…}
上的
私有集{}
来让序列化程序在序列化输出中显示那些链接的类。我也读过这本书,但并不总是最好的方法,但很少有人解释如何使它更健壮

任何关于这方面的建议都将不胜感激,因为它让我感到有些纠结,为什么有时所有的东西都在那里(在文件中),有时却没有


在类之前添加
[Serializable]
似乎与厕所没有什么区别

在处理完文件后,您应该始终
.Flush()
。@Aron这是一个普遍的观点,关闭文件就足够了。需要刷新将是可怕的API设计。问题不在于文件本身,而在于将类序列化到文件中。另外,如果文件是在using构造中创建的,那么应该关闭并删除该对象,以便GC执行其操作