【问题标题】:InvalidOperationException during DataTemplate serializationDataTemplate 序列化期间的 InvalidOperationException
【发布时间】:2015-09-18 07:28:54
【问题描述】:

我正在尝试找到一种方法来序列化 DataTemplate。

ObservableCollection<XMLColumns> xmlColumns = new ObservableCollection<XMLColumns>();
try
{
    ReadColumnXMLData(File.ReadAllText(Environment.CurrentDirectory + "lorenzo_columns_test.xml"));
}
catch (Exception)
{
    //In Framework
    if (xmlColumns.Count == 0)
    {
        foreach (var item in grdAuft.Columns)
        {
            XMLColumns col = new XMLColumns();
            col.FieldName = item.FieldName;
            if (item.CellTemplate != null)
            {
                col.CellTemplate = item.CellTemplate;
            }
            if (item.GroupValueTemplate != null)
            {
                col.GroupValueTemplate = item.GroupValueTemplate;
            }
            if (item.ActualEditSettings != null)
            {
                //col.EditSettings = item.ActualEditSettings;
            }
            xmlColumns.Add(col);
        }
        string xml = LsgUtil.SerializeCollection(xmlColumns);
        File.WriteAllText(Environment.CurrentDirectory + "lorenzo_columns_test.xml",xml);
    }
}

Serialize 函数引发我无法序列化DataTemplate 的异常。

这是数据结构:

public class XMLColumns
{
    public string FieldName { get; set; }
    public DataTemplate CellTemplate { get; set; }
    public DataTemplate GroupValueTemplate { get; set; }
    //public object EditSettings { get; set; }
}

谢谢

编辑:

异常:无效操作异常

堆栈跟踪:

System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModelmodel, String ns, ImportContext context, String dataType,XmlAttributes a, Boolean repeats, Boolean openModel, RecursionLimiterlimiter)    bei
System.Xml.Serialization.XmlReflectionImporter.ImportElement(TypeModelmodel, XmlRootAttribute root, String defaultNamespace,RecursionLimiter limiter)    bei
System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(Typetype, XmlRootAttribute root, String defaultNamespace)    bei
System.Xml.Serialization.XmlSerializer..ctor(Type type, StringdefaultNamespace)    bei
System.Xml.Serialization.XmlSerializer..ctor(Type type)    bei
ApplicationBase.LsgUtil.SerializeCollection[T1](ObservableCollection`1coll)    bei
 LSG_Bau.Views.Auft.AuftView.AuftView_Loaded(Objectsender, RoutedEventArgs e) inc:\Application\App_LSG\LSG_Bau\LSG_Bau\Views\Auft\2_UE\AuftView.xaml.cs:Zeile100.    bei
 System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)    bei
System.Windows.EventRoute.InvokeHandlersImpl(Object source,RoutedEventArgs args, Boolean reRaised)    bei
System.Windows.UIElement.RaiseEventImpl(DependencyObject sender,RoutedEventArgs args)    bei
System.Windows.UIElement.RaiseEvent(RoutedEventArgs e)    bei
System.Windows.BroadcastEventHelper.BroadcastEvent(DependencyObjectroot, RoutedEvent routedEvent)    bei
System.Windows.BroadcastEventHelper.BroadcastLoadedEvent(Object root) bei
 MS.Internal.LoadedOrUnloadedOperation.DoWork()    bei
System.Windows.Media.MediaContext.FireLoadedPendingCallbacks()    bei
System.Windows.Media.MediaContext.FireInvokeOnRenderCallbacks()    bei
System.Windows.Media.MediaContext.RenderMessageHandlerCore(ObjectresizedCompositionTarget)    bei
System.Windows.Media.MediaContext.AnimatedRenderMessageHandler(ObjectresizedCompositionTarget)    bei
System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegatecallback, Object args, Int32 numArgs)    bei
MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Objectsource, Delegate method, Object args, Int32 numArgs, DelegatecatchHandler)

SerializeCollection 方法:

public static string SerializeCollection<T1>(ObservableCollection<T1> coll)
            {
                var xs = new XmlSerializer(typeof (ObservableCollection<T1>));
                using (var writer = new StringWriter())
                {
                    xs.Serialize(writer, coll);

                    return writer.ToString();
                }
            }

【问题讨论】:

  • 能否发布异常详细信息:堆栈跟踪、消息、引发异常的行?

标签: c# wpf serialization datatemplate


【解决方案1】:

尝试在类的顶部添加Serializable 属性。

[Serializable] // Set this attribute to the class that you want to serialize
public class XMLColumns
{
    public string FieldName { get; set; }
    public DataTemplate CellTemplate { get; set; }
    public DataTemplate GroupValueTemplate { get; set; }
    //public object EditSettings { get; set; }
}

然后你可以通过这样做来序列化你的对象:

public void SerializeXMLColumns()
{
    XMLColumns col = new XMLColumns();
    col.FieldName = "Field1";
    col.CellTemplate = new CellTemplate();
    col.GroupValueTemplate = new GroupValueTemplate();
    IFormatter formatter = new BinaryFormatter();
    Stream stream = new FileStream("MyXMLColumns.bin", FileMode.Create, FileAccess.Write, FileShare.None);
    formatter.Serialize(stream, col);
    stream.Close();
}

并以这种方式反序列化:

public void DeserializeXMLColumns()
{
    IFormatter formatter = new BinaryFormatter();
    Stream stream = new FileStream("XMLColumns.bin", FileMode.Open, FileAccess.Read, FileShare.Read);
    XMLColumns col = (XMLColumns) formatter.Deserialize(stream);
    stream.Close();

    // Test
    Console.WriteLine("FieldName: {0}", col.FieldName);
    Console.WriteLine("CellTemplate: {0}", col.CellTemplate.ToString());
    Console.WriteLine("GroupValueTemplate: {0}", col.GroupValueTemplate.ToString());
}

还请考虑:

需要注意的是,Serializable 属性不能被继承。如果从 MyObject 派生新类,新类也必须用属性标记,否则无法序列化。

因此,您还需要在 DataTemplate 类的顶部添加 Serializable 属性。

[Serializable]
public class DataTemplate
{
    ...
}

看看:MSDN - Basic Serialization

【讨论】:

  • 表示DataTemplate类型不能序列化
  • 请发布您的DataTemplate 类定义和当前错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-11
  • 2011-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多