예제 #1
0
        protected override void DoWrite(Node node)
        {
            switch (node.Type)
            {
            case NodeType.DocumentStart:
            {
                var obj = new DocumentModel {
                    SerializationValue = node.Value
                };
                stack.Push(obj);
                cache.Push(stack);
                stack = new Stack <NodeModel>();
                break;
            }

            case NodeType.DocumentEnd:
            {
                var root = stack.SingleOrDefault <NodeModel>();
                stack = cache.Pop();

                var document = (DocumentModel)stack.Pop();
                document.Root = root;

                TargetDocument = document;
                break;
            }

            case NodeType.ObjectStart:
            {
                var obj = new ObjectModel {
                    SerializationValue = node.Value
                };
                stack.Push(obj);
                cache.Push(stack);
                stack = new Stack <NodeModel>();
                break;
            }

            case NodeType.ObjectEnd:
            {
                var properties = stack.Cast <PropertyModel>();
                stack = cache.Pop();

                var obj = (ObjectModel)stack.Peek();
                obj.AddPropertyRange(properties.Reverse());

                if (!cache.Any() && (stack.Count <= 1))
                {
                    var document = new DocumentModel();
                    document.Root = obj;

                    TargetDocument = document;
                }

                break;
            }

            case NodeType.CollectionStart:
            {
                var collection = new CollectionModel {
                    SerializationValue = node.Value
                };
                stack.Push(collection);
                cache.Push(stack);
                stack = new Stack <NodeModel>();
                break;
            }

            case NodeType.CollectionEnd:
            {
                var items = stack;
                stack = cache.Pop();

                var obj = (CollectionModel)stack.Peek();
                obj.AddRange(items.Reverse());

                break;
            }

            case NodeType.PropertyStart:
            {
                var property = new PropertyModel {
                    SerializationValue = node.Value
                };
                stack.Push(property);
                cache.Push(stack);
                stack = new Stack <NodeModel>();
                break;
            }

            case NodeType.PropertyEnd:
            {
                NodeModel value = null;
                if (stack.Count == 0)
                {
                    value = new ValueModel {
                        Value = null
                    }
                }
                ;
                else if (stack.Count == 1)
                {
                    value = stack.Pop();
                }
                else
                {
                    throw new Exception("Property cannot have more than one value.");
                }

                stack = cache.Pop();
                var property = (PropertyModel)stack.Peek();
                property.Value = value;

                break;
            }

            case NodeType.Value:
            {
                var value = new ValueModel {
                    Value = node.Value
                };
                stack.Push(value);
                break;
            }
            }
        }
예제 #2
0
 public DocumentModel(ObjectModel root)
 {
     this.Root = root;
 }