У меня проблема, когда я хочу сериализировать XML с помощью DataContract, у меня возникает исключение ошибки, в котором мне предлагается использовать DataContractResolver или добавить типы UnKnown ...
У меня есть 3 плагина, которые могут быть загружены динамически с помощьюDll: Class1, Class2 и ClassPanel и pluginProperty Class3, который является общим для всех плагинов.
Я создаю различные экземпляры плагинов и сохраняю их в контейнере. Главное окно и панели имеют контейнер
, поэтому я бы сериализовал каждый плагин, включенный в контейнер, в субконтейнер и в субконтейнер ..., а также в каждый макет свойства (Class3).
Так что я не знаю, чтобы добавить различные типы, необходимые для DataContract (динамически). Может быть, невозможно использовать DataContract в этом контексте, и я делаю и пишу пользовательскую программу для сериализации? Спасибо за вашу помощь
//MainWindow.xaml.cs
using System.Runtime.Serialization;
using System.Windows;
using System.Xml;
namespace ClassApp1
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var p = new Plugins();
var type = p.GetType();
var dcs = new DataContractSerializer(type);
using (XmlWriter wr = XmlWriter.Create(@"j:\message.xml"))
{
dcs.WriteObject(wr, p);
}
}
}
}
//Plugin.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Runtime.Serialization;
namespace ClassApp1
{
[DataContract]
public class Plugins
{
[DataMember] public List<object> container = new List<object>();
public List<Type> pluginTypes;
public List<Assembly> assemblies = new List<Assembly>();
public Plugins()
{
assemblies.Add(Assembly.LoadFile(System.IO.Path.Combine(@"J:\ProjetC#\Cockpit-master\ClassApp1\bin\Debug", "ClassLibrary3.dll")));
assemblies.Add(Assembly.LoadFile(System.IO.Path.Combine(@"J:\ProjetC#\Cockpit-master\ClassApp1\bin\Debug", "ClassLibrary1.dll")));
assemblies.Add(Assembly.LoadFile(System.IO.Path.Combine(@"J:\ProjetC#\Cockpit-master\ClassApp1\bin\Debug", "ClassLibrary2.dll")));
assemblies.Add(Assembly.LoadFile(System.IO.Path.Combine(@"J:\ProjetC#\Cockpit-master\ClassPanel\bin\Debug", "ClassPanel.dll")));
pluginTypes = AppDomain.CurrentDomain.GetAssemblies().SelectMany(a => a.GetTypes()).Where(a => a.ToString().StartsWith("Class")).ToList();
var listoftypes = new List<string> { "ClassLibrary1.Class1", "ClassLibrary2.Class2", "ClassPanel.ClassPanel" };
var listofargs = new List<object> { new object[] { 1, "iamClass1" }, new object[] { 2, 123d }, new object[] { this } };
for (int i = 0; i < listoftypes.Count(); i++)
{
container.Add(Activator.CreateInstance(GetType(listoftypes[i]), listofargs[i]));
}
}
public Type GetType(string model)
{
foreach (var p in assemblies)
{
Type type = p.GetType(model);
if (type != null)
return type;
}
return null;
}
}
}
//Class1.cs
using ClassLibrary3;
using System.Runtime.Serialization;
namespace ClassLibrary1
{
[DataContract]
public class Class1
{
[DataMember] public int id { get; set; }
[DataMember] public string message { get; set; }
[DataMember]public Class3 Layout { get; set; }
public Class1(params object[] obj)
{
this.id = (int)obj[0];
this.message =(string)obj[1];
Layout = new Class3(id, "fromClass1");
}
}
}
//Class2.cs
using ClassLibrary3;
using System.Runtime.Serialization;
namespace ClassLibrary2
{
[DataContract]
public class Class2
{
[DataMember] public int id { get; set; }
[DataMember] public double number { get; set; }
[DataMember] public Class3 Layout { get; set; }
public Class2(params object[] obj)
{
this.id = (int)obj[0];
this.number = (double)obj[1];
Layout = new Class3(id, "fromClass2");
}
}
}
//Class3.cs
using System.Runtime.Serialization;
using System.Windows.Forms;
namespace ClassLibrary3
{
[DataContract]
public class Class3
{
public Class3(int id, string name)
{
this.id = id;
this.name = name;
abc = "ABCDEF";
}
[DataMember] public int id { get; set; }
[DataMember] public string name { get; set; }
[DataMember] public string abc { get; set; }
}
}
//ClassPanel.cs
using ClassApp1;
using ClassLibrary3;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
namespace ClassPanel
{
[DataContract]
public class ClassPanel
{
[DataMember]public List<object> container = new List<object>();
[DataMember]public Class3 Layout { get; set; }
public Plugins plg { get; set; }
public ClassPanel(params object[] obj)
{
plg = (Plugins)obj[0];
Layout = new Class3(0, "fromPanel");
var listoftypes = new List<string> { "ClassLibrary1.Class1", "ClassLibrary2.Class2", "ClassLibrary1.Class1" };
var listofargs = new List<object> { new object[] { 11, "iamClass1Panel" }, new object[] { 12, 11d }, new object[] { 12, "iamClass1BisPanel" } };
for (int i = 0; i < listoftypes.Count(); i++)
{
container.Add(Activator.CreateInstance(plg.GetType(listoftypes[i]), listofargs[i]));
}
}
}
}