Мне нужно было заполнить древовидное представление, для которого я создал собственную коллекцию.
Вот классы пользовательской коллекции.
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; }
}
}
Вот как я заполняю данные в иерархическом порядке.так что разнородное дерево может быть заселено ...
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 };
}
}
Вот код сериализации, который я использую .....
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);
}
Я застрял в этом ..... Он не сериализует, он выдает ошибку ....
{"There was an error generating the XML document."}
"The type HierarchialTreeView.Model.ChildC may not be used in this context."
Помогите, плз, я застрял в этом очень плохом
Было трудно заполнить гетерогенное древовидное представление требуемого типа, и теперьэто произошло
Спасибо, Не ... Способность сообщества была очень полезной :)
Редактировать:
Внутреннее исключение:
{"Тип HierarchialTreeView.Model.ChildC может не бытьиспользуется в этом контексте. "}
Внутреннее внутреннее исключение = null
Больше нет исключений после этого .... (внутреннее внутреннее внутреннее исключение)
Трассировка стека (на случай, если это кому-то нужно):
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: