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
- 诸如此类,对于你能说出的每一个序列化程序(相信我,我能说出很多):它们都有不同的特性和它们能做/不能做的事情——通常是出于良好的协议原因,而不仅仅是冷漠/无能
某些序列化程序(protobuf net当然允许)允许您通过序列化代理类型进行混合和匹配,这意味着您可以告诉它在遇到某些类型时以静默方式替换它们(特别是,如果您的模型中有80%是序列化友好的,则可以将其他20%替换为引擎的一部分)-但在不了解更多细节的情况下,很难说这是否会有帮助。请不要只要求我们为您解决问题。向我们展示你是如何试图自己解决问题的,然后向我们展示结果是什么,并告诉我们为什么你觉得它不起作用。请参阅“”,以获取您真正需要阅读的优秀文章。可以序列化非原始成员,前提是它们本身是序列化的。这里的问题是非原始成员不是可序列化类型的,并且我不能编辑它们。@ AboudZakaria:您可以发布一个类,您认为是“不可序列化类型”的例子吗?为什么类型不能序列化?编辑:不知道为什么你认为你的类型不可序列化,我们可能在黑暗中对什么序列化程序能够做这项工作,更不用说哪一个将提供“最快的方式来做这件事”。@ AboudZakaria:看起来有派生的和抽象的类,这对于一些序列化者来说可能是个问题;你能公布你实际使用的课程吗?关于“可能包含数百个结果”的性能要求,这相对来说非常小,尤其是在程序启动时执行一次(我使用
XmlSerializer
在184毫秒内反序列化22000个对象)。性能可能不是问题;专注于简单且可维护的序列化例程(记住Marc Gravell的建议:将序列化模型与第三方模型分开),这真正取决于所讨论的类型是否与json.net一起工作;这绝对不能保证,尤其是在使用复杂的第三方库时objects@MarcGravell有趣的是,我还没有遇到过这种情况,但我使用json.NET的大多数东西都是专有类型;这是绝对不能保证的,尤其是在处理复杂的第三方库对象时,您必须制作不太复杂的对象