网上有很多例子展示了如何使用CodeDomSerializer。其中大多数都展示了如何覆盖该类的Serialize和Deserialize方法。问题是此Serialize方法采用IDesignerSerializationManager类型的manager参数。我无法弄清楚如何创建该类型的实例......
这是我尝试的内容:
var root = new Form();
root.Controls.Add(new TextBox()
{
Text = "hello"
});
Type rootSerializerType = Type.GetType("System.ComponentModel.Design.Serialization.RootCodeDomSerializer, System.Design, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", true);
var rootSerializer = Activator.CreateInstance(
rootSerializerType,
BindingFlags.CreateInstance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance,
null,
null,
null) as CodeDomSerializer;
IDesignerSerializationManager manager = new DesignerSerializationManager();
var serializationResult = (CodeTypeDeclaration)rootSerializer.Serialize(manager, root);
因为我的管理器对象没有正确初始化,所以当我调用如上所示的Serialize方法时,抛出了这个异常:
[System.InvalidOperationException]"无法调用此方法 因为序列化管理器没有活动状态 序列化会话。"
我已经Google搜索并检查了StackOverflow,我无法找到任何有关如何在我的.Serialize调用之前正确初始化管理器对象的帮助。
有什么想法吗?
答案 0 :(得分:2)
您需要创建该部分。将最后两行更改为:
DesignerSerializationManager manager = new DesignerSerializationManager();
using (var session = manager.CreateSession())
{
var serializationResult = (CodeTypeDeclaration)rootSerializer.Serialize(manager, root);
// handle the result here
}
使用具体类DesignerSerializationManager或var,因为IDesignerSerializationManager接口没有CreateSession方法。