Discussion:
Custom CodeDomSerializer issues
(too old to reply)
Lionel
2007-09-24 16:04:43 UTC
Permalink
Hi All,

I wrote a custom CodeDom serializer class that first invokes default
serialization for a class, after which it does some custom code
generation.

public override object Serialize(IDesignerSerializationManager
manager, object value)
{
CodeDomSerializer baseSerializer =
(CodeDomSerializer)manager.GetSerializer(myBaseType,
typeof(CodeDomSerializer));
object codeObject = baseSerializer.Serialize(manager, value);

//custom code gen here...
}

My class uses the following attributes to specify the above
serializer:

[DesignerSerializer(typeof(MyCustomSerializer),
typeof(CodeDomSerializer))]
public partial class MyClass : UserControl
{
.....
}

The custom code looks fine, but the MyClass instance variable is being
generated local to the InitializeComponent() method:

private void InitializeComponent()
{
MyControls.MyClass myClass1 = new MyControls.MyClass();
...
//
// MyClass code generator
// Updated on Monday, September 24, 2007 at 4:40:42 PM
//
myClass1.ShowImage = true;
myClass1.Location = new System.Drawing.Point(149, 3);
...
}

I want the instance to be defined as a class level variable, rather
than inside InitializeComponent(). I have read that an
InstanceDescriptor can help specify this, but am as yet unable to get
it working.

Would appreciate any insights you have on doing so.

Thanks,
Lionel
G Himangi
2007-09-25 08:36:22 UTC
Permalink
I think a local variable will be generated only if you create it through the
IDesignerHost.CreateComponent method.

---------
- G Himangi, Sky Software http://www.ssware.com
Shell MegaPack : GUI Controls For Drop-In Windows Explorer like Shell
Browsing Functionality For Your App (.Net & ActiveX Editions).
EZNamespaceExtensions.Net : Develop namespace extensions rapidly in .Net
EZShellExtensions.Net : Develop all shell extensions,explorer bars and BHOs
rapidly in .Net
---------
Post by Lionel
Hi All,
I wrote a custom CodeDom serializer class that first invokes default
serialization for a class, after which it does some custom code
generation.
public override object Serialize(IDesignerSerializationManager
manager, object value)
{
CodeDomSerializer baseSerializer =
(CodeDomSerializer)manager.GetSerializer(myBaseType,
typeof(CodeDomSerializer));
object codeObject = baseSerializer.Serialize(manager, value);
//custom code gen here...
}
My class uses the following attributes to specify the above
[DesignerSerializer(typeof(MyCustomSerializer),
typeof(CodeDomSerializer))]
public partial class MyClass : UserControl
{
.....
}
The custom code looks fine, but the MyClass instance variable is being
private void InitializeComponent()
{
MyControls.MyClass myClass1 = new MyControls.MyClass();
...
//
// MyClass code generator
// Updated on Monday, September 24, 2007 at 4:40:42 PM
//
myClass1.ShowImage = true;
myClass1.Location = new System.Drawing.Point(149, 3);
...
}
I want the instance to be defined as a class level variable, rather
than inside InitializeComponent(). I have read that an
InstanceDescriptor can help specify this, but am as yet unable to get
it working.
Would appreciate any insights you have on doing so.
Thanks,
Lionel
Lionel
2007-09-25 09:24:58 UTC
Permalink
Thanks for your reply. Where should I use
IDesignerHost.CreateComponent in the serialization process?

When commenting out the [DesignerSerializer] attribute on my class I
see that VS.NET automatically creates the myClass1 variable external
to InitializeComponent(), at class scope.

//[DesignerSerializer(typeof(MyCustomSerializer),
typeof(CodeDomSerializer))]
public partial class MyClass :UserControl
{
.....
}

But by adding the attribute the variable is once again created inside
InitializeComponent(), so I assume theres something I'm not specifying
correctly in my custom serializer code?

I would have expected Serialize(manager, value); to have a flag
indicating if I'd like it serialized locally, or at class level.

Thanks,
Lionel
I think alocalvariable will be generated only if you create it through the
IDesignerHost.CreateComponent method.
---------
- G Himangi, Sky Software http://www.ssware.com
Shell MegaPack : GUI Controls For Drop-In Windows Explorer like Shell
Browsing Functionality For Your App (.Net & ActiveX Editions).
EZNamespaceExtensions.Net : Develop namespace extensions rapidly in .Net
EZShellExtensions.Net : Develop all shell extensions,explorer bars and BHOs
rapidly in .Net
---------
Post by Lionel
Hi All,
I wrote a customCodeDomserializer class that first invokes default
serialization for a class, after which it does some custom code
generation.
public override object Serialize(IDesignerSerializationManager
manager, object value)
{
CodeDomSerializer baseSerializer =
(CodeDomSerializer)manager.GetSerializer(myBaseType,
typeof(CodeDomSerializer));
object codeObject = baseSerializer.Serialize(manager, value);
//custom code gen here...
}
My class uses the following attributes to specify the above
[DesignerSerializer(typeof(MyCustomSerializer),
typeof(CodeDomSerializer))]
public partial class MyClass :UserControl
{
.....
}
The custom code looks fine, but the MyClass instance variable is being
private voidInitializeComponent()
{
MyControls.MyClass myClass1 = new MyControls.MyClass();
...
//
// MyClass code generator
// Updated on Monday, September 24, 2007 at 4:40:42 PM
//
myClass1.ShowImage = true;
myClass1.Location = new System.Drawing.Point(149, 3);
...
}
I want the instance to be defined as a class level variable, rather
than insideInitializeComponent(). I have read that an
InstanceDescriptor can help specify this, but am as yet unable to get
it working.
Would appreciate any insights you have on doing so.
Thanks,
Lionel
Lionel
2007-09-25 13:23:24 UTC
Permalink
Never mind, solved it...
Post by Lionel
Hi All,
I wrote a custom CodeDom serializer class that first invokes default
serialization for a class, after which it does some custom code
generation.
public override object Serialize(IDesignerSerializationManager
manager, object value)
{
CodeDomSerializer baseSerializer =
(CodeDomSerializer)manager.GetSerializer(myBaseType,
typeof(CodeDomSerializer));
object codeObject = baseSerializer.Serialize(manager, value);
//custom code gen here...
}
My class uses the following attributes to specify the above
[DesignerSerializer(typeof(MyCustomSerializer),
typeof(CodeDomSerializer))]
public partial class MyClass : UserControl
{
.....
}
The custom code looks fine, but the MyClass instance variable is being
private void InitializeComponent()
{
MyControls.MyClass myClass1 = new MyControls.MyClass();
...
//
// MyClass code generator
// Updated on Monday, September 24, 2007 at 4:40:42 PM
//
myClass1.ShowImage = true;
myClass1.Location = new System.Drawing.Point(149, 3);
...
}
I want the instance to be defined as a class level variable, rather
than inside InitializeComponent(). I have read that an
InstanceDescriptor can help specify this, but am as yet unable to get
it working.
Would appreciate any insights you have on doing so.
Thanks,
Lionel
schneider
2007-09-25 13:58:34 UTC
Permalink
Would be nice to know...
Post by Lionel
Never mind, solved it...
Post by Lionel
Hi All,
I wrote a custom CodeDom serializer class that first invokes default
serialization for a class, after which it does some custom code
generation.
public override object Serialize(IDesignerSerializationManager
manager, object value)
{
CodeDomSerializer baseSerializer =
(CodeDomSerializer)manager.GetSerializer(myBaseType,
typeof(CodeDomSerializer));
object codeObject = baseSerializer.Serialize(manager, value);
//custom code gen here...
}
My class uses the following attributes to specify the above
[DesignerSerializer(typeof(MyCustomSerializer),
typeof(CodeDomSerializer))]
public partial class MyClass : UserControl
{
.....
}
The custom code looks fine, but the MyClass instance variable is being
private void InitializeComponent()
{
MyControls.MyClass myClass1 = new MyControls.MyClass();
...
//
// MyClass code generator
// Updated on Monday, September 24, 2007 at 4:40:42 PM
//
myClass1.ShowImage = true;
myClass1.Location = new System.Drawing.Point(149, 3);
...
}
I want the instance to be defined as a class level variable, rather
than inside InitializeComponent(). I have read that an
InstanceDescriptor can help specify this, but am as yet unable to get
it working.
Would appreciate any insights you have on doing so.
Thanks,
Lionel
Loading...