C# 序列化具有非基本数据成员的对象

C# 序列化具有非基本数据成员的对象,c#,serialization,C#,Serialization,我有一个具有以下结构的类 public class MyClass: { public GMapMarker marker; // from GMap.NET library public TwitterStatus tweet; // from TweetSharp library public List<MYTriple> triples = new List<MYTriple>(); public List<MYGrap

我有一个具有以下结构的类

    public class MyClass:
{
    public GMapMarker marker; // from GMap.NET library
    public TwitterStatus tweet; // from TweetSharp library
    public List<MYTriple> triples = new List<MYTriple>();
    public List<MYGraph> Graph = new List<MYGraph>();
}
公共类MyClass:
{
公共GMapMarker标记;//来自GMap.NET库
公共TwitterStatus tweet;//来自TweetSharp库
公共列表三元组=新列表();
公共列表图=新列表();
}
我有名单

List<MyClass> mylist;
列出mylist;
我只想将列表序列化/保存到一个文件中,并在下一次启动程序时再次加载它

该列表可能包含数百个结果,我只关心性能

我试过Jason,反序列化列表时出现异常

无法创建抽象类的InvalidOperationException实例


您可以使用下面的代码使用Json.net,这是最可靠的

string json = JsonConvert.SerializeObject(mylist, Formatting.Indented);
File.WriteAllText(@"c:\mylist.json", json);
使用json.net

   File.WriteAllText(@".\temp.txt", JsonConvert.SerializeObject(myInstance));



  MyClass instanceOnLoad = JsonConvert.DeserializeObject<MyClass>(File.ReadAllText(@".\temp.txt"));
File.WriteAllText(@“\temp.txt”,JsonConvert.SerializeObject(myInstance));
MyClass instanceOnLoad=JsonConvert.DeserializeObject(File.ReadAllText(@.\temp.txt));

没有比这更容易的了

不同的序列化选项具有不同的功能和权衡。没有一个选项可以满足您的所有需求,因为:

  • 并非所有东西都是
    [Serializable]
    (对于
    BinaryFormatter
    )-加上
    BinaryFormatter
    几乎总是一个糟糕的选择
  • 并非所有的东西都有一个适用于
    XmlSerializer
  • 诸如此类,对于你能说出的每一个序列化程序(相信我,我能说出很多):它们都有不同的特性和它们能做/不能做的事情——通常是出于良好的协议原因,而不仅仅是冷漠/无能
在我看来,这里的问题是您试图序列化实现细节,而不是序列化数据。如果您创建一个只表示数据的自定义DTO模型(但不依赖于第三方类型),那么就可以创建一个合理的序列化模型,该模型可以非常有效地与您选择的序列化程序配合使用,并且在升级库引用时不会严重中断,或者完全切换到另一个库


某些序列化程序(protobuf net当然允许)允许您通过序列化代理类型进行混合和匹配,这意味着您可以告诉它在遇到某些类型时以静默方式替换它们(特别是,如果您的模型中有80%是序列化友好的,则可以将其他20%替换为引擎的一部分)-但在不了解更多细节的情况下,很难说这是否会有帮助。

请不要只要求我们为您解决问题。向我们展示你是如何试图自己解决问题的,然后向我们展示结果是什么,并告诉我们为什么你觉得它不起作用。请参阅“”,以获取您真正需要阅读的优秀文章。可以序列化非原始成员,前提是它们本身是序列化的。这里的问题是非原始成员不是可序列化类型的,并且我不能编辑它们。@ AboudZakaria:您可以发布一个类,您认为是“不可序列化类型”的例子吗?为什么类型不能序列化?编辑:不知道为什么你认为你的类型不可序列化,我们可能在黑暗中对什么序列化程序能够做这项工作,更不用说哪一个将提供“最快的方式来做这件事”。@ AboudZakaria:看起来有派生的和抽象的类,这对于一些序列化者来说可能是个问题;你能公布你实际使用的课程吗?关于“可能包含数百个结果”的性能要求,这相对来说非常小,尤其是在程序启动时执行一次(我使用
XmlSerializer
在184毫秒内反序列化22000个对象)。性能可能不是问题;专注于简单且可维护的序列化例程(记住Marc Gravell的建议:将序列化模型与第三方模型分开),这真正取决于所讨论的类型是否与json.net一起工作;这绝对不能保证,尤其是在使用复杂的第三方库时objects@MarcGravell有趣的是,我还没有遇到过这种情况,但我使用json.NET的大多数东西都是专有类型;这是绝对不能保证的,尤其是在处理复杂的第三方库对象时,您必须制作不太复杂的对象