现在,我正在序列化这样一个类:
class Session
{
String setting1;
String setting2;
...etc... (other member variables)
List<SessionAction> actionsPerformed;
}
其中SessionAction是一个只有一个方法的接口。 SessionAction接口的所有实现都有各种属性来描述特定SessionAction的作用。
目前,我将其序列化为一个文件,可以使用默认的.Net二进制序列化程序再次加载。现在,我想将其序列化为模板。这个模板只是序列化到文件的SessionActions列表,但是在另一次将它加载到内存中时,我希望这些SessionActions的一些属性需要用户输入(我计划动态生成GUI控件)取决于属性类型)。现在,我一直坚持确定最好的方法。
有没有什么方法可以标记一些属性,以便在使用反射时,我可以确定哪些属性需要用户输入?或者我的其他选择是什么?如果有任何不清楚的地方,请随时发表评论。
答案 0 :(得分:1)
有关信息,我建议您不要将BinaryFormatter
用于长期存储的任何内容;它非常brittle between versions。对于短期消息,您可以使用相同的版本进行序列化和反序列化。
我会推荐以下任何一项:XmlSerializer
,DataContractSerializer
(3.0),或快速二进制,protobuf-net;所有这些都是基于合同的,更多的版本容忍。
回答问题;您可以使用Nullable<T>
之类的值来表示值类型,将null
用于字符串等 - 并为那些空的请求输入?还有其他涉及ShouldSerialize*
模式之类的路由,但这可能会扰乱序列化API。
答案 1 :(得分:0)
如果你从一开始就知道什么属性会有SessionAction,你必须实现IDeserializationCallback并将那些属性[NonSerialized]置于那些。实现OnDeserialization方法时,您将从用户处获取新值。