1 //-----------------------------------------------------------------------------
2 // Copyright (c) Microsoft Corporation. All rights reserved.
3 //-----------------------------------------------------------------------------
4 namespace System.Runtime.Serialization
7 using System.Collections;
8 using System.Collections.Generic;
9 using System.Globalization;
10 using System.Reflection;
12 using System.Security;
15 public abstract class PrimitiveDataContract : DataContract
17 internal abstract class PrimitiveDataContract : DataContract
20 [Fx.Tag.SecurityNote(Critical = "Holds instance of CriticalHelper which keeps state that is cached statically for serialization."
21 + " Static fields are marked SecurityCritical or readonly to prevent data from being modified or leaked to other components in appdomain.")]
23 PrimitiveDataContractCriticalHelper helper;
25 [Fx.Tag.SecurityNote(Critical = "Initializes SecurityCritical field 'helper'.",
26 Safe = "Doesn't leak anything.")]
27 [SecuritySafeCritical]
28 protected PrimitiveDataContract(Type type, XmlDictionaryString name, XmlDictionaryString ns)
29 : base(new PrimitiveDataContractCriticalHelper(type, name, ns))
31 helper = base.Helper as PrimitiveDataContractCriticalHelper;
34 static internal PrimitiveDataContract GetPrimitiveDataContract(Type type)
36 return DataContract.GetBuiltInDataContract(type) as PrimitiveDataContract;
39 static internal PrimitiveDataContract GetPrimitiveDataContract(string name, string ns)
41 return DataContract.GetBuiltInDataContract(name, ns) as PrimitiveDataContract;
44 internal abstract string WriteMethodName { get; }
45 internal abstract string ReadMethodName { get; }
47 internal override XmlDictionaryString TopLevelElementNamespace
49 get { return DictionaryGlobals.SerializationNamespace; }
53 internal override bool CanContainReferences
58 internal override bool IsPrimitive
63 internal override bool IsBuiltInDataContract
71 internal MethodInfo XmlFormatWriterMethod
73 [Fx.Tag.SecurityNote(Critical = "Fetches the critical XmlFormatWriterMethod property.",
74 Safe = "XmlFormatWriterMethod only needs to be protected for write; initialized in getter if null.")]
75 [SecuritySafeCritical]
78 if (helper.XmlFormatWriterMethod == null)
80 if (UnderlyingType.IsValueType)
81 helper.XmlFormatWriterMethod = typeof(XmlWriterDelegator).GetMethod(WriteMethodName, Globals.ScanAllMembers, null, new Type[] { UnderlyingType, typeof(XmlDictionaryString), typeof(XmlDictionaryString) }, null);
83 helper.XmlFormatWriterMethod = typeof(XmlObjectSerializerWriteContext).GetMethod(WriteMethodName, Globals.ScanAllMembers, null, new Type[] { typeof(XmlWriterDelegator), UnderlyingType, typeof(XmlDictionaryString), typeof(XmlDictionaryString) }, null);
85 return helper.XmlFormatWriterMethod;
89 internal MethodInfo XmlFormatContentWriterMethod
91 [Fx.Tag.SecurityNote(Critical = "Fetches the critical XmlFormatContentWriterMethod property.",
92 Safe = "XmlFormatContentWriterMethod only needs to be protected for write; initialized in getter if null.")]
93 [SecuritySafeCritical]
96 if (helper.XmlFormatContentWriterMethod == null)
98 if (UnderlyingType.IsValueType)
99 helper.XmlFormatContentWriterMethod = typeof(XmlWriterDelegator).GetMethod(WriteMethodName, Globals.ScanAllMembers, null, new Type[] { UnderlyingType }, null);
101 helper.XmlFormatContentWriterMethod = typeof(XmlObjectSerializerWriteContext).GetMethod(WriteMethodName, Globals.ScanAllMembers, null, new Type[] { typeof(XmlWriterDelegator), UnderlyingType }, null);
103 return helper.XmlFormatContentWriterMethod;
107 internal MethodInfo XmlFormatReaderMethod
109 [Fx.Tag.SecurityNote(Critical = "Fetches the critical XmlFormatReaderMethod property.",
110 Safe = "XmlFormatReaderMethod only needs to be protected for write; initialized in getter if null.")]
111 [SecuritySafeCritical]
114 if (helper.XmlFormatReaderMethod == null)
116 helper.XmlFormatReaderMethod = typeof(XmlReaderDelegator).GetMethod(ReadMethodName, Globals.ScanAllMembers);
118 return helper.XmlFormatReaderMethod;
122 public override void WriteXmlValue(XmlWriterDelegator xmlWriter, object obj, XmlObjectSerializerWriteContext context)
124 xmlWriter.WriteAnyType(obj);
127 protected object HandleReadValue(object obj, XmlObjectSerializerReadContext context)
129 context.AddNewObject(obj);
133 protected bool TryReadNullAtTopLevel(XmlReaderDelegator reader)
135 Attributes attributes = new Attributes();
136 attributes.Read(reader);
137 if (attributes.Ref != Globals.NewObjectId)
138 throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(XmlObjectSerializer.CreateSerializationException(SR.GetString(SR.CannotDeserializeRefAtTopLevel, attributes.Ref)));
139 if (attributes.XsiNil)
147 internal override bool Equals(object other, Dictionary<DataContractPairKey, object> checkedContracts)
149 PrimitiveDataContract dataContract = other as PrimitiveDataContract;
150 if (dataContract != null)
152 Type thisType = this.GetType();
153 Type otherType = other.GetType();
154 return (thisType.Equals(otherType) || thisType.IsSubclassOf(otherType) || otherType.IsSubclassOf(thisType));
159 [Fx.Tag.SecurityNote(Critical = "Holds all state used for for (de)serializing primitives."
160 + " Since the data is cached statically, we lock down access to it.")]
161 #if !NO_SECURITY_ATTRIBUTES
162 [SecurityCritical(SecurityCriticalScope.Everything)]
164 class PrimitiveDataContractCriticalHelper : DataContract.DataContractCriticalHelper
166 MethodInfo xmlFormatWriterMethod;
167 MethodInfo xmlFormatContentWriterMethod;
168 MethodInfo xmlFormatReaderMethod;
170 internal PrimitiveDataContractCriticalHelper(Type type, XmlDictionaryString name, XmlDictionaryString ns)
173 SetDataContractName(name, ns);
176 internal MethodInfo XmlFormatWriterMethod
178 get { return xmlFormatWriterMethod; }
179 set { xmlFormatWriterMethod = value; }
182 internal MethodInfo XmlFormatContentWriterMethod
184 get { return xmlFormatContentWriterMethod; }
185 set { xmlFormatContentWriterMethod = value; }
188 internal MethodInfo XmlFormatReaderMethod
190 get { return xmlFormatReaderMethod; }
191 set { xmlFormatReaderMethod = value; }
197 internal class CharDataContract : PrimitiveDataContract
199 internal CharDataContract()
200 : this(DictionaryGlobals.CharLocalName, DictionaryGlobals.SerializationNamespace)
204 internal CharDataContract(XmlDictionaryString name, XmlDictionaryString ns)
205 : base(typeof(char), name, ns)
209 internal override string WriteMethodName { get { return "WriteChar"; } }
210 internal override string ReadMethodName { get { return "ReadElementContentAsChar"; } }
212 public override void WriteXmlValue(XmlWriterDelegator writer, object obj, XmlObjectSerializerWriteContext context)
214 writer.WriteChar((char)obj);
217 public override object ReadXmlValue(XmlReaderDelegator reader, XmlObjectSerializerReadContext context)
219 return (context == null) ? reader.ReadElementContentAsChar()
220 : HandleReadValue(reader.ReadElementContentAsChar(), context);
224 internal class AsmxCharDataContract : CharDataContract
226 internal AsmxCharDataContract() : base(DictionaryGlobals.CharLocalName, DictionaryGlobals.AsmxTypesNamespace) { }
229 internal class BooleanDataContract : PrimitiveDataContract
231 internal BooleanDataContract()
232 : base(typeof(bool), DictionaryGlobals.BooleanLocalName, DictionaryGlobals.SchemaNamespace)
236 internal override string WriteMethodName { get { return "WriteBoolean"; } }
237 internal override string ReadMethodName { get { return "ReadElementContentAsBoolean"; } }
239 public override void WriteXmlValue(XmlWriterDelegator writer, object obj, XmlObjectSerializerWriteContext context)
241 writer.WriteBoolean((bool)obj);
244 public override object ReadXmlValue(XmlReaderDelegator reader, XmlObjectSerializerReadContext context)
246 return (context == null) ? reader.ReadElementContentAsBoolean()
247 : HandleReadValue(reader.ReadElementContentAsBoolean(), context);
251 internal class SignedByteDataContract : PrimitiveDataContract
253 internal SignedByteDataContract()
254 : base(typeof(sbyte), DictionaryGlobals.SignedByteLocalName, DictionaryGlobals.SchemaNamespace)
258 internal override string WriteMethodName { get { return "WriteSignedByte"; } }
259 internal override string ReadMethodName { get { return "ReadElementContentAsSignedByte"; } }
261 public override void WriteXmlValue(XmlWriterDelegator writer, object obj, XmlObjectSerializerWriteContext context)
263 writer.WriteSignedByte((sbyte)obj);
266 public override object ReadXmlValue(XmlReaderDelegator reader, XmlObjectSerializerReadContext context)
268 return (context == null) ? reader.ReadElementContentAsSignedByte()
269 : HandleReadValue(reader.ReadElementContentAsSignedByte(), context);
273 internal class UnsignedByteDataContract : PrimitiveDataContract
275 internal UnsignedByteDataContract()
276 : base(typeof(byte), DictionaryGlobals.UnsignedByteLocalName, DictionaryGlobals.SchemaNamespace)
280 internal override string WriteMethodName { get { return "WriteUnsignedByte"; } }
281 internal override string ReadMethodName { get { return "ReadElementContentAsUnsignedByte"; } }
283 public override void WriteXmlValue(XmlWriterDelegator writer, object obj, XmlObjectSerializerWriteContext context)
285 writer.WriteUnsignedByte((byte)obj);
288 public override object ReadXmlValue(XmlReaderDelegator reader, XmlObjectSerializerReadContext context)
290 return (context == null) ? reader.ReadElementContentAsUnsignedByte()
291 : HandleReadValue(reader.ReadElementContentAsUnsignedByte(), context);
295 internal class ShortDataContract : PrimitiveDataContract
297 internal ShortDataContract()
298 : base(typeof(short), DictionaryGlobals.ShortLocalName, DictionaryGlobals.SchemaNamespace)
302 internal override string WriteMethodName { get { return "WriteShort"; } }
303 internal override string ReadMethodName { get { return "ReadElementContentAsShort"; } }
305 public override void WriteXmlValue(XmlWriterDelegator writer, object obj, XmlObjectSerializerWriteContext context)
307 writer.WriteShort((short)obj);
310 public override object ReadXmlValue(XmlReaderDelegator reader, XmlObjectSerializerReadContext context)
312 return (context == null) ? reader.ReadElementContentAsShort()
313 : HandleReadValue(reader.ReadElementContentAsShort(), context);
317 internal class UnsignedShortDataContract : PrimitiveDataContract
319 internal UnsignedShortDataContract()
320 : base(typeof(ushort), DictionaryGlobals.UnsignedShortLocalName, DictionaryGlobals.SchemaNamespace)
324 internal override string WriteMethodName { get { return "WriteUnsignedShort"; } }
325 internal override string ReadMethodName { get { return "ReadElementContentAsUnsignedShort"; } }
327 public override void WriteXmlValue(XmlWriterDelegator writer, object obj, XmlObjectSerializerWriteContext context)
329 writer.WriteUnsignedShort((ushort)obj);
332 public override object ReadXmlValue(XmlReaderDelegator reader, XmlObjectSerializerReadContext context)
334 return (context == null) ? reader.ReadElementContentAsUnsignedShort()
335 : HandleReadValue(reader.ReadElementContentAsUnsignedShort(), context);
339 internal class IntDataContract : PrimitiveDataContract
341 internal IntDataContract()
342 : base(typeof(int), DictionaryGlobals.IntLocalName, DictionaryGlobals.SchemaNamespace)
346 internal override string WriteMethodName { get { return "WriteInt"; } }
347 internal override string ReadMethodName { get { return "ReadElementContentAsInt"; } }
349 public override void WriteXmlValue(XmlWriterDelegator writer, object obj, XmlObjectSerializerWriteContext context)
351 writer.WriteInt((int)obj);
354 public override object ReadXmlValue(XmlReaderDelegator reader, XmlObjectSerializerReadContext context)
356 return (context == null) ? reader.ReadElementContentAsInt()
357 : HandleReadValue(reader.ReadElementContentAsInt(), context);
361 internal class UnsignedIntDataContract : PrimitiveDataContract
363 internal UnsignedIntDataContract()
364 : base(typeof(uint), DictionaryGlobals.UnsignedIntLocalName, DictionaryGlobals.SchemaNamespace)
368 internal override string WriteMethodName { get { return "WriteUnsignedInt"; } }
369 internal override string ReadMethodName { get { return "ReadElementContentAsUnsignedInt"; } }
371 public override void WriteXmlValue(XmlWriterDelegator writer, object obj, XmlObjectSerializerWriteContext context)
373 writer.WriteUnsignedInt((uint)obj);
376 public override object ReadXmlValue(XmlReaderDelegator reader, XmlObjectSerializerReadContext context)
378 return (context == null) ? reader.ReadElementContentAsUnsignedInt()
379 : HandleReadValue(reader.ReadElementContentAsUnsignedInt(), context);
383 internal class LongDataContract : PrimitiveDataContract
385 internal LongDataContract()
386 : this(DictionaryGlobals.LongLocalName, DictionaryGlobals.SchemaNamespace)
390 internal LongDataContract(XmlDictionaryString name, XmlDictionaryString ns)
391 : base(typeof(long), name, ns)
395 internal override string WriteMethodName { get { return "WriteLong"; } }
396 internal override string ReadMethodName { get { return "ReadElementContentAsLong"; } }
398 public override void WriteXmlValue(XmlWriterDelegator writer, object obj, XmlObjectSerializerWriteContext context)
400 writer.WriteLong((long)obj);
403 public override object ReadXmlValue(XmlReaderDelegator reader, XmlObjectSerializerReadContext context)
405 return (context == null) ? reader.ReadElementContentAsLong()
406 : HandleReadValue(reader.ReadElementContentAsLong(), context);
409 internal class IntegerDataContract : LongDataContract
411 internal IntegerDataContract() : base(DictionaryGlobals.integerLocalName, DictionaryGlobals.SchemaNamespace) { }
413 internal class PositiveIntegerDataContract : LongDataContract
415 internal PositiveIntegerDataContract() : base(DictionaryGlobals.positiveIntegerLocalName, DictionaryGlobals.SchemaNamespace) { }
417 internal class NegativeIntegerDataContract : LongDataContract
419 internal NegativeIntegerDataContract() : base(DictionaryGlobals.negativeIntegerLocalName, DictionaryGlobals.SchemaNamespace) { }
421 internal class NonPositiveIntegerDataContract : LongDataContract
423 internal NonPositiveIntegerDataContract() : base(DictionaryGlobals.nonPositiveIntegerLocalName, DictionaryGlobals.SchemaNamespace) { }
425 internal class NonNegativeIntegerDataContract : LongDataContract
427 internal NonNegativeIntegerDataContract() : base(DictionaryGlobals.nonNegativeIntegerLocalName, DictionaryGlobals.SchemaNamespace) { }
430 internal class UnsignedLongDataContract : PrimitiveDataContract
432 internal UnsignedLongDataContract()
433 : base(typeof(ulong), DictionaryGlobals.UnsignedLongLocalName, DictionaryGlobals.SchemaNamespace)
437 internal override string WriteMethodName { get { return "WriteUnsignedLong"; } }
438 internal override string ReadMethodName { get { return "ReadElementContentAsUnsignedLong"; } }
440 public override void WriteXmlValue(XmlWriterDelegator writer, object obj, XmlObjectSerializerWriteContext context)
442 writer.WriteUnsignedLong((ulong)obj);
445 public override object ReadXmlValue(XmlReaderDelegator reader, XmlObjectSerializerReadContext context)
447 return (context == null) ? reader.ReadElementContentAsUnsignedLong()
448 : HandleReadValue(reader.ReadElementContentAsUnsignedLong(), context);
452 internal class FloatDataContract : PrimitiveDataContract
454 internal FloatDataContract()
455 : base(typeof(float), DictionaryGlobals.FloatLocalName, DictionaryGlobals.SchemaNamespace)
459 internal override string WriteMethodName { get { return "WriteFloat"; } }
460 internal override string ReadMethodName { get { return "ReadElementContentAsFloat"; } }
462 public override void WriteXmlValue(XmlWriterDelegator writer, object obj, XmlObjectSerializerWriteContext context)
464 writer.WriteFloat((float)obj);
467 public override object ReadXmlValue(XmlReaderDelegator reader, XmlObjectSerializerReadContext context)
469 return (context == null) ? reader.ReadElementContentAsFloat()
470 : HandleReadValue(reader.ReadElementContentAsFloat(), context);
474 internal class DoubleDataContract : PrimitiveDataContract
476 internal DoubleDataContract()
477 : base(typeof(double), DictionaryGlobals.DoubleLocalName, DictionaryGlobals.SchemaNamespace)
481 internal override string WriteMethodName { get { return "WriteDouble"; } }
482 internal override string ReadMethodName { get { return "ReadElementContentAsDouble"; } }
484 public override void WriteXmlValue(XmlWriterDelegator writer, object obj, XmlObjectSerializerWriteContext context)
486 writer.WriteDouble((double)obj);
489 public override object ReadXmlValue(XmlReaderDelegator reader, XmlObjectSerializerReadContext context)
491 return (context == null) ? reader.ReadElementContentAsDouble()
492 : HandleReadValue(reader.ReadElementContentAsDouble(), context);
496 internal class DecimalDataContract : PrimitiveDataContract
498 internal DecimalDataContract()
499 : base(typeof(decimal), DictionaryGlobals.DecimalLocalName, DictionaryGlobals.SchemaNamespace)
503 internal override string WriteMethodName { get { return "WriteDecimal"; } }
504 internal override string ReadMethodName { get { return "ReadElementContentAsDecimal"; } }
506 public override void WriteXmlValue(XmlWriterDelegator writer, object obj, XmlObjectSerializerWriteContext context)
508 writer.WriteDecimal((decimal)obj);
511 public override object ReadXmlValue(XmlReaderDelegator reader, XmlObjectSerializerReadContext context)
513 return (context == null) ? reader.ReadElementContentAsDecimal()
514 : HandleReadValue(reader.ReadElementContentAsDecimal(), context);
518 internal class DateTimeDataContract : PrimitiveDataContract
520 internal DateTimeDataContract()
521 : base(typeof(DateTime), DictionaryGlobals.DateTimeLocalName, DictionaryGlobals.SchemaNamespace)
525 internal override string WriteMethodName { get { return "WriteDateTime"; } }
526 internal override string ReadMethodName { get { return "ReadElementContentAsDateTime"; } }
528 public override void WriteXmlValue(XmlWriterDelegator writer, object obj, XmlObjectSerializerWriteContext context)
530 writer.WriteDateTime((DateTime)obj);
533 public override object ReadXmlValue(XmlReaderDelegator reader, XmlObjectSerializerReadContext context)
535 return (context == null) ? reader.ReadElementContentAsDateTime()
536 : HandleReadValue(reader.ReadElementContentAsDateTime(), context);
540 internal class StringDataContract : PrimitiveDataContract
542 internal StringDataContract()
543 : this(DictionaryGlobals.StringLocalName, DictionaryGlobals.SchemaNamespace)
547 internal StringDataContract(XmlDictionaryString name, XmlDictionaryString ns)
548 : base(typeof(string), name, ns)
552 internal override string WriteMethodName { get { return "WriteString"; } }
553 internal override string ReadMethodName { get { return "ReadElementContentAsString"; } }
555 public override void WriteXmlValue(XmlWriterDelegator writer, object obj, XmlObjectSerializerWriteContext context)
557 writer.WriteString((string)obj);
560 public override object ReadXmlValue(XmlReaderDelegator reader, XmlObjectSerializerReadContext context)
564 return TryReadNullAtTopLevel(reader) ? null : reader.ReadElementContentAsString();
568 return HandleReadValue(reader.ReadElementContentAsString(), context);
572 internal class TimeDataContract : StringDataContract
574 internal TimeDataContract() : base(DictionaryGlobals.timeLocalName, DictionaryGlobals.SchemaNamespace) { }
576 internal class DateDataContract : StringDataContract
578 internal DateDataContract() : base(DictionaryGlobals.dateLocalName, DictionaryGlobals.SchemaNamespace) { }
580 internal class HexBinaryDataContract : StringDataContract
582 internal HexBinaryDataContract() : base(DictionaryGlobals.hexBinaryLocalName, DictionaryGlobals.SchemaNamespace) { }
584 internal class GYearMonthDataContract : StringDataContract
586 internal GYearMonthDataContract() : base(DictionaryGlobals.gYearMonthLocalName, DictionaryGlobals.SchemaNamespace) { }
588 internal class GYearDataContract : StringDataContract
590 internal GYearDataContract() : base(DictionaryGlobals.gYearLocalName, DictionaryGlobals.SchemaNamespace) { }
592 internal class GMonthDayDataContract : StringDataContract
594 internal GMonthDayDataContract() : base(DictionaryGlobals.gMonthDayLocalName, DictionaryGlobals.SchemaNamespace) { }
596 internal class GDayDataContract : StringDataContract
598 internal GDayDataContract() : base(DictionaryGlobals.gDayLocalName, DictionaryGlobals.SchemaNamespace) { }
600 internal class GMonthDataContract : StringDataContract
602 internal GMonthDataContract() : base(DictionaryGlobals.gMonthLocalName, DictionaryGlobals.SchemaNamespace) { }
604 internal class NormalizedStringDataContract : StringDataContract
606 internal NormalizedStringDataContract() : base(DictionaryGlobals.normalizedStringLocalName, DictionaryGlobals.SchemaNamespace) { }
608 internal class TokenDataContract : StringDataContract
610 internal TokenDataContract() : base(DictionaryGlobals.tokenLocalName, DictionaryGlobals.SchemaNamespace) { }
612 internal class LanguageDataContract : StringDataContract
614 internal LanguageDataContract() : base(DictionaryGlobals.languageLocalName, DictionaryGlobals.SchemaNamespace) { }
616 internal class NameDataContract : StringDataContract
618 internal NameDataContract() : base(DictionaryGlobals.NameLocalName, DictionaryGlobals.SchemaNamespace) { }
620 internal class NCNameDataContract : StringDataContract
622 internal NCNameDataContract() : base(DictionaryGlobals.NCNameLocalName, DictionaryGlobals.SchemaNamespace) { }
624 internal class IDDataContract : StringDataContract
626 internal IDDataContract() : base(DictionaryGlobals.XSDIDLocalName, DictionaryGlobals.SchemaNamespace) { }
628 internal class IDREFDataContract : StringDataContract
630 internal IDREFDataContract() : base(DictionaryGlobals.IDREFLocalName, DictionaryGlobals.SchemaNamespace) { }
632 internal class IDREFSDataContract : StringDataContract
634 internal IDREFSDataContract() : base(DictionaryGlobals.IDREFSLocalName, DictionaryGlobals.SchemaNamespace) { }
636 internal class ENTITYDataContract : StringDataContract
638 internal ENTITYDataContract() : base(DictionaryGlobals.ENTITYLocalName, DictionaryGlobals.SchemaNamespace) { }
640 internal class ENTITIESDataContract : StringDataContract
642 internal ENTITIESDataContract() : base(DictionaryGlobals.ENTITIESLocalName, DictionaryGlobals.SchemaNamespace) { }
644 internal class NMTOKENDataContract : StringDataContract
646 internal NMTOKENDataContract() : base(DictionaryGlobals.NMTOKENLocalName, DictionaryGlobals.SchemaNamespace) { }
648 internal class NMTOKENSDataContract : StringDataContract
650 internal NMTOKENSDataContract() : base(DictionaryGlobals.NMTOKENSLocalName, DictionaryGlobals.SchemaNamespace) { }
653 internal class ByteArrayDataContract : PrimitiveDataContract
655 internal ByteArrayDataContract()
656 : base(typeof(byte[]), DictionaryGlobals.ByteArrayLocalName, DictionaryGlobals.SchemaNamespace)
660 internal override string WriteMethodName { get { return "WriteBase64"; } }
661 internal override string ReadMethodName { get { return "ReadElementContentAsBase64"; } }
663 public override void WriteXmlValue(XmlWriterDelegator writer, object obj, XmlObjectSerializerWriteContext context)
665 writer.WriteBase64((byte[])obj);
668 public override object ReadXmlValue(XmlReaderDelegator reader, XmlObjectSerializerReadContext context)
672 return TryReadNullAtTopLevel(reader) ? null : reader.ReadElementContentAsBase64();
676 return HandleReadValue(reader.ReadElementContentAsBase64(), context);
681 internal class ObjectDataContract : PrimitiveDataContract
683 internal ObjectDataContract()
684 : base(typeof(object), DictionaryGlobals.ObjectLocalName, DictionaryGlobals.SchemaNamespace)
688 internal override string WriteMethodName { get { return "WriteAnyType"; } }
689 internal override string ReadMethodName { get { return "ReadElementContentAsAnyType"; } }
691 public override void WriteXmlValue(XmlWriterDelegator writer, object obj, XmlObjectSerializerWriteContext context)
696 public override object ReadXmlValue(XmlReaderDelegator reader, XmlObjectSerializerReadContext context)
699 if (reader.IsEmptyElement)
706 string localName = reader.LocalName;
707 string ns = reader.NamespaceURI;
711 reader.ReadEndElement();
714 catch (XmlException xes)
716 throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(XmlObjectSerializer.CreateSerializationException(SR.GetString(SR.XmlForObjectCannotHaveContent, localName, ns), xes));
719 return (context == null) ? obj : HandleReadValue(obj, context);
722 internal override bool CanContainReferences
727 internal override bool IsPrimitive
729 get { return false; }
734 internal class TimeSpanDataContract : PrimitiveDataContract
736 internal TimeSpanDataContract()
737 : this(DictionaryGlobals.TimeSpanLocalName, DictionaryGlobals.SerializationNamespace)
741 internal TimeSpanDataContract(XmlDictionaryString name, XmlDictionaryString ns)
742 : base(typeof(TimeSpan), name, ns)
746 internal override string WriteMethodName { get { return "WriteTimeSpan"; } }
747 internal override string ReadMethodName { get { return "ReadElementContentAsTimeSpan"; } }
749 public override void WriteXmlValue(XmlWriterDelegator writer, object obj, XmlObjectSerializerWriteContext context)
751 writer.WriteTimeSpan((TimeSpan)obj);
754 public override object ReadXmlValue(XmlReaderDelegator reader, XmlObjectSerializerReadContext context)
756 return (context == null) ? reader.ReadElementContentAsTimeSpan()
757 : HandleReadValue(reader.ReadElementContentAsTimeSpan(), context);
761 internal class XsDurationDataContract : TimeSpanDataContract
763 internal XsDurationDataContract() : base(DictionaryGlobals.TimeSpanLocalName, DictionaryGlobals.SchemaNamespace) { }
766 internal class GuidDataContract : PrimitiveDataContract
768 internal GuidDataContract()
769 : this(DictionaryGlobals.GuidLocalName, DictionaryGlobals.SerializationNamespace)
773 internal GuidDataContract(XmlDictionaryString name, XmlDictionaryString ns)
774 : base(typeof(Guid), name, ns)
778 internal override string WriteMethodName { get { return "WriteGuid"; } }
779 internal override string ReadMethodName { get { return "ReadElementContentAsGuid"; } }
781 public override void WriteXmlValue(XmlWriterDelegator writer, object obj, XmlObjectSerializerWriteContext context)
783 writer.WriteGuid((Guid)obj);
786 public override object ReadXmlValue(XmlReaderDelegator reader, XmlObjectSerializerReadContext context)
788 return (context == null) ? reader.ReadElementContentAsGuid()
789 : HandleReadValue(reader.ReadElementContentAsGuid(), context);
793 internal class AsmxGuidDataContract : GuidDataContract
795 internal AsmxGuidDataContract() : base(DictionaryGlobals.GuidLocalName, DictionaryGlobals.AsmxTypesNamespace) { }
798 internal class UriDataContract : PrimitiveDataContract
800 internal UriDataContract()
801 : base(typeof(Uri), DictionaryGlobals.UriLocalName, DictionaryGlobals.SchemaNamespace)
805 internal override string WriteMethodName { get { return "WriteUri"; } }
806 internal override string ReadMethodName { get { return "ReadElementContentAsUri"; } }
808 public override void WriteXmlValue(XmlWriterDelegator writer, object obj, XmlObjectSerializerWriteContext context)
810 writer.WriteUri((Uri)obj);
813 public override object ReadXmlValue(XmlReaderDelegator reader, XmlObjectSerializerReadContext context)
817 return TryReadNullAtTopLevel(reader) ? null : reader.ReadElementContentAsUri();
821 return HandleReadValue(reader.ReadElementContentAsUri(), context);
826 internal class QNameDataContract : PrimitiveDataContract
828 internal QNameDataContract()
829 : base(typeof(XmlQualifiedName), DictionaryGlobals.QNameLocalName, DictionaryGlobals.SchemaNamespace)
833 internal override string WriteMethodName { get { return "WriteQName"; } }
834 internal override string ReadMethodName { get { return "ReadElementContentAsQName"; } }
836 internal override bool IsPrimitive
838 get { return false; }
841 public override void WriteXmlValue(XmlWriterDelegator writer, object obj, XmlObjectSerializerWriteContext context)
843 writer.WriteQName((XmlQualifiedName)obj);
846 public override object ReadXmlValue(XmlReaderDelegator reader, XmlObjectSerializerReadContext context)
850 return TryReadNullAtTopLevel(reader) ? null : reader.ReadElementContentAsQName();
854 return HandleReadValue(reader.ReadElementContentAsQName(), context);
858 internal override void WriteRootElement(XmlWriterDelegator writer, XmlDictionaryString name, XmlDictionaryString ns)
860 if (object.ReferenceEquals(ns, DictionaryGlobals.SerializationNamespace))
861 writer.WriteStartElement(Globals.SerPrefix, name, ns);
862 else if (ns != null && ns.Value != null && ns.Value.Length > 0)
863 writer.WriteStartElement(Globals.ElementPrefix, name, ns);
865 writer.WriteStartElement(name, ns);