protected XamlWriterInternalBase(XamlSchemaContext schemaContext, XamlWriterStateManager manager)
        {
            this.sctx    = schemaContext;
            this.manager = manager;
            var p = new PrefixLookup(sctx)
            {
                IsCollectingNamespaces = true
            };                                                                            // it does not raise unknown namespace error.

            service_provider = ValueSerializerContext.Create(p, schemaContext, this, this, this, this, this as IXamlObjectWriterFactory);
        }
예제 #2
0
        public XamlObjectReader(object instance, XamlSchemaContext schemaContext, XamlObjectReaderSettings settings)
        {
            if (schemaContext == null)
            {
                throw new ArgumentNullException("schemaContext");
            }
            // FIXME: special case? or can it be generalized? In .NET, For Type instance Instance returns TypeExtension at root StartObject, while for Array it remains to return Array.
            if (instance is Type)
            {
                instance = new TypeExtension((Type)instance);
            }

            // See also Instance property for this weirdness.
            this.root_raw = instance;
            instance      = TypeExtensionMethods.GetExtensionWrapped(instance);
            this.root     = instance;

            sctx          = schemaContext;
            this.settings = settings ?? new XamlObjectReaderSettings();

            // check type validity. Note that some checks also needs done at Read() phase. (it is likely FIXME:)
            if (instance != null)
            {
                var type = instance.GetType();
                if (!type.GetTypeInfo().IsPublic)
                {
                    throw new XamlObjectReaderException(String.Format("instance type '{0}' must be public and non-nested.", type));
                }
                var xt = SchemaContext.GetXamlType(type);
                if (xt.ConstructionRequiresArguments && xt.GetConstructorArguments().Count == 0 && xt.TypeConverter == null)
                {
                    throw new XamlObjectReaderException(String.Format("instance type '{0}' has no default constructor.", type));
                }
            }

            value_serializer_context = ValueSerializerContext.Create(new PrefixLookup(sctx), sctx, null, null, null, null, null);
            new XamlObjectNodeIterator(instance, sctx, value_serializer_context, this.settings).PrepareReading();
        }