网络上有许多示例展示了如何使用CodeDomSerializer。它们中的大多数都演示如何重写该类的序列化和反序列化方法。问题是此序列化方法采用 IDesignerSerializationManager 类型的管理器参数。我不知道如何创建这种类型的实例...
这是我尝试过的:
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] "无法调用此方法 因为序列化管理器没有活动的 序列化会话。
我已经用谷歌搜索并检查了 StackOverflow,但我找不到任何关于如何在我的 .序列化调用。
有什么想法吗?
您需要创建该部分。将最后两行更改为:
DesignerSerializationManager manager = new DesignerSerializationManager();
using (var session = manager.CreateSession())
{
var serializationResult = (CodeTypeDeclaration)rootSerializer.Serialize(manager, root);
// handle the result here
}
使用具体的类 DesignerSerializationManager 或 var,因为 IDesignerSerializationManager 接口没有 CreateSession 方法。