使用CodeDomSerializer进行序列化 - 如何初始化Manager对象?

时间:2017-11-14 16:30:17

标签: c# serialization codedom

网上有很多例子展示了如何使用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调用之前正确初始化管理器对象的帮助。

有什么想法吗?

1 个答案:

答案 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方法。