2 // System.ComponentModel.Design.Serialization.CodeDomSerializer
5 // Ivan N. Zlatev (contact i-nZ.net)
7 // (C) 2007 Ivan N. Zlatev
10 // Permission is hereby granted, free of charge, to any person obtaining
11 // a copy of this software and associated documentation files (the
12 // "Software"), to deal in the Software without restriction, including
13 // without limitation the rights to use, copy, modify, merge, publish,
14 // distribute, sublicense, and/or sell copies of the Software, and to
15 // permit persons to whom the Software is furnished to do so, subject to
16 // the following conditions:
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
33 using System
.Collections
;
34 using System
.ComponentModel
;
35 using System
.ComponentModel
.Design
;
39 namespace System
.ComponentModel
.Design
.Serialization
41 public class CodeDomSerializer
: CodeDomSerializerBase
44 public CodeDomSerializer ()
49 public virtual object SerializeAbsolute (IDesignerSerializationManager manager
, object value)
52 throw new ArgumentNullException ("value");
54 throw new ArgumentNullException ("manager");
56 SerializeAbsoluteContext context
= new SerializeAbsoluteContext ();
57 manager
.Context
.Push (context
);
58 object result
= this.Serialize (manager
, value);
59 manager
.Context
.Pop ();
63 public virtual object Serialize (IDesignerSerializationManager manager
, object value)
66 throw new ArgumentNullException ("value");
68 throw new ArgumentNullException ("manager");
70 object serialized
= null;
71 bool isComplete
= false;
72 CodeExpression createExpr
= base.SerializeCreationExpression (manager
, value, out isComplete
);
73 if (createExpr
!= null) {
75 serialized
= createExpr
;
77 CodeStatementCollection statements
= new CodeStatementCollection ();
78 base.SerializeProperties (manager
, statements
, value, new Attribute
[0]);
79 base.SerializeEvents (manager
, statements
, value, new Attribute
[0]);
80 serialized
= statements
;
82 base.SetExpression (manager
, value, createExpr
);
87 [Obsolete ("This method has been deprecated. Use SerializeToExpression or GetExpression instead.")]
88 protected CodeExpression
SerializeToReferenceExpression (IDesignerSerializationManager manager
, object value)
90 return base.SerializeToExpression (manager
, value);
93 // I am not sure what this does, but the only name I can think of this can get is a variable name from
95 public virtual string GetTargetComponentName (CodeStatement statement
, CodeExpression expression
, Type targetType
)
97 if (expression
is CodeFieldReferenceExpression
)
98 return ((CodeFieldReferenceExpression
) expression
).FieldName
;
99 else if (expression
is CodeVariableReferenceExpression
)
100 return ((CodeVariableReferenceExpression
) expression
).VariableName
;
104 public virtual CodeStatementCollection
SerializeMember (IDesignerSerializationManager manager
,
105 object owningobject
, MemberDescriptor member
)
108 throw new ArgumentNullException ("member");
109 if (owningobject
== null)
110 throw new ArgumentNullException ("owningobject");
112 throw new ArgumentNullException ("manager");
114 CodeStatementCollection statements
= new CodeStatementCollection ();
116 CodeExpression expression
= base.GetExpression (manager
, owningobject
);
117 if (expression
== null) {
118 string name
= manager
.GetName (owningobject
);
120 name
= base.GetUniqueName (manager
, owningobject
);
121 expression
= new CodeVariableReferenceExpression (name
);
122 base.SetExpression (manager
, owningobject
, expression
);
125 if (member
is PropertyDescriptor
)
126 base.SerializeProperty (manager
, statements
, owningobject
, (PropertyDescriptor
) member
);
127 if (member
is EventDescriptor
)
128 base.SerializeEvent (manager
, statements
, owningobject
, (EventDescriptor
) member
);
133 public virtual CodeStatementCollection
SerializeMemberAbsolute (IDesignerSerializationManager manager
,
134 object owningobject
, MemberDescriptor member
)
137 throw new ArgumentNullException ("member");
138 if (owningobject
== null)
139 throw new ArgumentNullException ("owningobject");
141 throw new ArgumentNullException ("manager");
143 SerializeAbsoluteContext context
= new SerializeAbsoluteContext (member
);
144 manager
.Context
.Push (context
);
145 CodeStatementCollection result
= this.SerializeMember (manager
, owningobject
, member
);
146 manager
.Context
.Pop ();
151 public virtual object Deserialize (IDesignerSerializationManager manager
, object codeObject
)
153 object deserialized
= null;
155 CodeExpression expression
= codeObject
as CodeExpression
;
156 if (expression
!= null)
157 deserialized
= base.DeserializeExpression (manager
, null, expression
);
159 CodeStatement statement
= codeObject
as CodeStatement
;
160 if (statement
!= null)
161 deserialized
= DeserializeStatementToInstance (manager
, statement
);
163 CodeStatementCollection statements
= codeObject
as CodeStatementCollection
;
164 if (statements
!= null) {
165 foreach (CodeStatement s
in statements
) {
166 if (deserialized
== null)
167 deserialized
= DeserializeStatementToInstance (manager
, s
);
169 DeserializeStatement (manager
, s
);
175 protected object DeserializeStatementToInstance (IDesignerSerializationManager manager
, CodeStatement statement
)
177 CodeAssignStatement assignment
= statement
as CodeAssignStatement
;
178 if (assignment
!= null) {
179 // CodeFieldReferenceExpression
181 CodeFieldReferenceExpression fieldRef
= assignment
.Left
as CodeFieldReferenceExpression
;
182 if (fieldRef
!= null)
183 return base.DeserializeExpression (manager
, fieldRef
.FieldName
, assignment
.Right
);
185 base.DeserializeStatement (manager
, statement
);