Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 7004603
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 27, 20262026-05-27T21:13:12+00:00 2026-05-27T21:13:12+00:00

I had to populate a tree view for which i have made a custom

  • 0

I had to populate a tree view for which i have made a custom collection
Here are the Classes of the custom collection

public class EntityBase : ObservableCollection<object>
{
    private string name;

    public string Name
    {
        get { return name; }
        set
        {
            name = value;
            InvokePropertyChange(this, new PropertyChangedEventArgs("Name"));
        }
    }        

    public event PropertyChangedEventHandler PropertyChanged;

    public void InvokePropertyChange(object sender, PropertyChangedEventArgs e)             
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(sender, e);
        }
    }


}

public class ParentX : EntityBase // Should be the root of my XML
{

}

public class Parent : EntityBase
{
    private ChildC _childC;        

    public ChildC ChildC
    {
        get { return _childC; }
        set { _childC = value; }
    }
}

public class ChildA : EntityBase
{

}

public class ChildB : EntityBase
{

}

public class ChildC : EntityBase
{
    private ObservableCollection<ChildB> children = new ObservableCollection<ChildB>();

    public ObservableCollection<ChildB> Children
    {
        get { return children; }
        set { children = value; }
    }
}

Here is the how i am filling the data in hierarchial order so that a heterogenious tree can be populated…

public class DataBase
{
    public ObservableCollection<object> GetData()
    {

        ChildB childB1 = new ChildB { Name = "Parent 1 - ChildB 1" };
        ChildB childB2 = new ChildB { Name = "Parent 1 - ChildB 2" };
        ChildA childA1 = new ChildA { childB1, childB2 }; // ChildA will have ChildB objects as its child
        childA1.Name = "Parent 1 - ChildA 1";

        ChildC childC = new ChildC{Name="CHildC"};
        for (int i = 0; i < 5; i++)
        {
            childC.Children.Add(new ChildB{Name="Pappu" + i}); // childC children Property will have childB Object
        }
        Parent parent1 = new Parent {childC, childA1}; // Parent class will have ChildC and ChildA as its child
        parent1.Name = "Parent1";

        //Family 2
        ParentX parentX=new ParentX{Name="Parent"};
        parentX.Add(parent1);                           //ParentX will have Parent as its child

        return new ObservableCollection<object> { parentX };
    }
}  

Here is the serialisation code that i am using…..

using (FileStream fileStream=new FileStream(@"D:\text.xml",FileMode.Create))
        {
            XmlSerializer xmlSerializer = new XmlSerializer(typeof(ParentX), new Type[] { typeof(Parent), typeof(ChildA), typeof(ChildC), typeof(ChildB)});
            if (data != null) xmlSerializer.Serialize(fileStream, data);
        }  

I am stuck at this ….. It Does not serialize its gives the error….

{"There was an error generating the XML document."}  
"The type HierarchialTreeView.Model.ChildC may not be used in this context."  

Plz help I am stuck at this real bad
It was difficult to populate a Heterogenious treeView of the required type and now this happened

Thanks Ne ways… Community has been very helpful 🙂

Edit :
Inner Exception :
{“The type HierarchialTreeView.Model.ChildC may not be used in this context.”}
Inner-inner exception = null
There is no more exceptions after this…. (inner inner inner ex)

Stack Trace (In case someone needs) :

System.InvalidOperationException was unhandled
Message=There was an error generating the XML document.
Source=System.Xml
StackTrace:
   at System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id)
   at System.Xml.Serialization.XmlSerializer.Serialize(Stream stream, Object o, XmlSerializerNamespaces namespaces)
   at System.Xml.Serialization.XmlSerializer.Serialize(Stream stream, Object o)
   at HierarchialTreeView.MainWindow.Button_Click(Object sender, RoutedEventArgs e)
   at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
   at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
   at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
   at System.Windows.UIElement.RaiseEvent(RoutedEventArgs e)
   at System.Windows.Controls.Primitives.ButtonBase.OnClick()
   at System.Windows.Controls.Button.OnClick()
   at System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e)
   at System.Windows.UIElement.OnMouseLeftButtonUpThunk(Object sender, MouseButtonEventArgs e)
   at System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
   at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
   at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
   at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
   at System.Windows.UIElement.ReRaiseEventAs(DependencyObject sender, RoutedEventArgs args, RoutedEvent newEvent)
   at System.Windows.UIElement.OnMouseUpThunk(Object sender, MouseButtonEventArgs e)
   at System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
   at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
   at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
   at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
   at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
   at System.Windows.UIElement.RaiseTrustedEvent(RoutedEventArgs args)
   at System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trusted)
   at System.Windows.Input.InputManager.ProcessStagingArea()
   at System.Windows.Input.InputManager.ProcessInput(InputEventArgs input)
   at System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport)
   at System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 y, Int32 wheel)
   at System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
   at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
   at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
   at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
   at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
   at System.Windows.Threading.Dispatcher.Run()
   at System.Windows.Application.RunDispatcher(Object ignore)
   at System.Windows.Application.RunInternal(Window window)
   at System.Windows.Application.Run(Window window)
   at System.Windows.Application.Run()
   at HierarchialTreeView.App.Main()
   at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
   at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
   at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()
InnerException: System.InvalidOperationException
   Message=The type HierarchialTreeView.Model.ChildC may not be used in this context.
   Source=System.Xml
   StackTrace:
        at System.Xml.Serialization.XmlSerializationWriter.WriteTypedPrimitive(String name, String ns, Object o, Boolean xsiType)
        at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterParentX.Write1_Object(String n, String ns, Object o, Boolean isNullable, Boolean needType)
        at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterParentX.Write1_Object(String n, String ns, Object o, Boolean isNullable, Boolean needType)
        at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterParentX.Write2_ArrayOfAnyType(Object o)
   InnerException: 
  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-27T21:13:12+00:00Added an answer on May 27, 2026 at 9:13 pm

    Here is an example of parent/child node hierarchy that can be serialized. Note the use of the common class Entity that is used for both ObservableCollections and as the base class for Node. The XmlInclude attribute is used on Entity to alert the serializer how to handle Entities that are Nodes.

    Also note this example showing XmlInclude usage on another hierarchy.

    The console output and serialized XML are included below.

    using System;
    using System.Diagnostics;
    using System.Collections.ObjectModel;
    using System.ComponentModel;
    using System.Collections.Specialized;
    using System.IO;
    using System.Xml.Serialization;
    
    
    namespace StackoverflowSerializingHierarchy
    {
    
        // Use System.Xml.Serialization.XmlInclude attribute to let 
        // serialize know how to handle an Entity that is a Node
        [XmlInclude(typeof(Node))]
        public abstract class Entity : INotifyPropertyChanged
        {
            // INotifyPropertyChanged implementation
            public event PropertyChangedEventHandler PropertyChanged;
            protected void OnPropertyChanged(string name)
            {
                PropertyChangedEventHandler handler = PropertyChanged;
                if (handler != null)
                {
                    handler(this, new PropertyChangedEventArgs(name));
                }
            }
    
    
            // Name Property
            private string _name;
            public string Name
            {
                get {
                    return _name;
                }
    
                set {
                    if (value == null) 
                            value = String.Empty;
    
                    if (String.IsNullOrEmpty(_name) || !_name.Equals(value)) {
                           _name = value;
                            OnPropertyChanged("Name");
                    }
                }    
            }
        }
    
    
        // use a Node class to represent an Entity that can have children
        public class Node : Entity
        {
            public Node() : base()
            {
                PropertyChanged += DataBase.DataPropertyChanged;
            }
    
            // Children property is an observable collection of the common base class Entity
            private ObservableCollection<Entity> _children;
            public ObservableCollection<Entity> Children
            {
                get
                {
                    return this._children;
                }
    
                set
                {
                    this._children = value;
                    if (this._children != null)
                    {
                        this._children.CollectionChanged += DataBase.DataCollectionChanged;
                    }
                }
            }
        }
    
    
        class Util
        {
            public static void SerializeObjectToXML<T>(T item, string FilePath)
            {
                XmlSerializer xs = new XmlSerializer(typeof(T));
                using (StreamWriter wr = new StreamWriter(FilePath))
                {
                    xs.Serialize(wr, item);
                }
            }
        }
    
        public class DataBase
        {
            public static void DataCollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
            {
                string name = "N/A";
                if (sender is Entity) // will be called for EntityBase and ObservableCollection<ChildB> via ChildC
                {
                    name = ((Entity)sender).Name;
                }            
                Console.WriteLine("Collection changed: performed {0} on ({1}) of type {2}", e.Action, name, sender.GetType().Name);
    
            }
    
            public static void DataPropertyChanged(object sender, PropertyChangedEventArgs e)
            {
                if (sender is Entity && e.PropertyName == "Name")
                {
                    string name = ((Entity)sender).Name;
                    Console.WriteLine("Data Property Changed {0} to ({1}) on type {2}", e.PropertyName, name, sender.GetType().Name);
                }
            }
    
    
            public Node GetData()
            {
                Node childB1 = new Node { Name = "Parent 1 - ChildB 1" };
    
                Node childB2 = new Node { Name = "Parent 1 - ChildB 2" };
    
                Node childA1 = new Node { Name = "Parent 1 - ChildA 1", 
                    Children  = new ObservableCollection<Entity>{childB1, childB2 }};
    
                // ChildA will have ChildB objects as its child
    
                Node childC = new Node { Name = "ChildC", Children = new ObservableCollection<Entity>()};
    
                for (int i = 0; i < 5; i++)
                {
                    //childC.
                    childC.Children.Add(new Node { Name = "Pappu" + i }); // childC children Property will have childB Object
                }
    
    
                Node parent1 = new Node { Name = "Parent 1", 
                    Children = new ObservableCollection<Entity>{ childC, childA1 }};
    
    
                //Family 2
                Node parentX = new Node { Name = "Parent", Children = new ObservableCollection<Entity> { parent1} };
    
                return parentX;
            }
    
        }  
    
    
        class Program
        {
            static void Main(string[] args)
            {
                DataBase db = new DataBase();
                Node data = db.GetData();
                Util.SerializeObjectToXML<Node>(data, @"d:\tmp\test.txt");
            }
        }
    }
    

    Console Output:

    Data Property Changed Name to (Parent 1 - ChildB 1) on type Node
    Data Property Changed Name to (Parent 1 - ChildB 2) on type Node
    Data Property Changed Name to (Parent 1 - ChildA 1) on type Node
    Data Property Changed Name to (ChildC) on type Node
    Data Property Changed Name to (Pappu0) on type Node
    Collection changed: performed Add on (N/A) of type ObservableCollection`1
    Data Property Changed Name to (Pappu1) on type Node
    Collection changed: performed Add on (N/A) of type ObservableCollection`1
    Data Property Changed Name to (Pappu2) on type Node
    Collection changed: performed Add on (N/A) of type ObservableCollection`1
    Data Property Changed Name to (Pappu3) on type Node
    Collection changed: performed Add on (N/A) of type ObservableCollection`1
    Data Property Changed Name to (Pappu4) on type Node
    Collection changed: performed Add on (N/A) of type ObservableCollection`1
    Data Property Changed Name to (Parent 1) on type Node
    Data Property Changed Name to (Parent) on type Node
    Press any key to continue . . .
    

    Serialized XML output file:

    <?xml version="1.0" encoding="utf-8"?>
    <Node xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <Name>Parent</Name>
      <Children>
        <Entity xsi:type="Node">
          <Name>Parent 1</Name>
          <Children>
            <Entity xsi:type="Node">
              <Name>ChildC</Name>
              <Children>
                <Entity xsi:type="Node">
                  <Name>Pappu0</Name>
                </Entity>
                <Entity xsi:type="Node">
                  <Name>Pappu1</Name>
                </Entity>
                <Entity xsi:type="Node">
                  <Name>Pappu2</Name>
                </Entity>
                <Entity xsi:type="Node">
                  <Name>Pappu3</Name>
                </Entity>
                <Entity xsi:type="Node">
                  <Name>Pappu4</Name>
                </Entity>
              </Children>
            </Entity>
            <Entity xsi:type="Node">
              <Name>Parent 1 - ChildA 1</Name>
              <Children>
                <Entity xsi:type="Node">
                  <Name>Parent 1 - ChildB 1</Name>
                </Entity>
                <Entity xsi:type="Node">
                  <Name>Parent 1 - ChildB 2</Name>
                </Entity>
              </Children>
            </Entity>
          </Children>
        </Entity>
      </Children>
    </Node>
    
    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I have a form which fills some objects of a Collection. I had the
If I had a viewmodel that looked something like this public class AddressViewModel {
I have a ListPreference which I populate dynamically when clicking on the list to
Had a page that was working fine. Only change I made was to add
Had a good search here but can't see anything that gets my mind in
We have a general organizational table structure, think of it s a Tree or
I have (well had) a bit of code that would get me my lovely
I have a populate combobox, and I'm so happy with it that I've even
I have had trouble finding help in the matlab documentation and previous questions about
I am using itextsharp to populate my PDFs. I have no issues with this.

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.