C#XmlSerializer - 无法像Exictionary一样序列化Exception.Data

时间:2018-03-08 04:36:27

标签: c# exception xmlserializer

[Microsoft(R).NET Framework,版本4.6.81.0]

- - There was an error reflecting type
  'Daff.Lae.TraceCommon.Exceptions.NicePopupException'.
- Cannot serialize member System.Exception.Data of type
  System.Collections.IDictionary, because it implements IDictionary.

自:

namespace Daff.Lae.TraceCommon.Exceptions
{
    [KnownType(typeof(Exception))]
    [XmlSerializerFormat]
    [Serializable]
    public class NicePopupException : Exception
    {
        private NicePopupException() { }

        public NicePopupException(string message) : base(message)
        { }

        public NicePopupException(string message, Exception innerException) : base(message, innerException)
        { }
    }
}

(绝望中)我尝试了[KnownType(typeof(Exception))], [XmlSerializerFormat], [Serializable]的所有变体。

(也就是说,它们不会导致错误)。

见到:

Visual Studio > Build > Build Daff.Lae.TraceCommon
$ cd to_appropriate_directory
$ xsd.exe .\Daff.Lae.TraceCommon.dll

问题IDictionary位于Exception _data

但是,如果删除NicePopupException的所有用途并更改为Exception,则不会出现此类错误。

我需要在NicePopupException添加其他内容才能使其正常工作吗?

1 个答案:

答案 0 :(得分:0)

我没有回答我的问题。这是我的评论的延续,但在答案中,所以我有更多的空间,可以格式化它。

我在评论中说我没有回应和搜索(Duck Duck Going!)并没有出现任何事情,所以看起来我们有一些不寻常的情况。它的旧代码,我不会付出任何努力来解决基础架构问题。

我要做的是获得解决方案(想要为所有C#类的子集生成模式),尝试单独为每个文件生成模式。如果有任何失败(就像它们那样 - 例外)那么它就不会影响其他每一类的(尝试)生成。

请注意,如果Window val df = Seq( (1, "A", "G", "2016-10-12T12:10:00.000Z"), (2, "B", "A", "2016-10-12T12:00:00.000Z"), (3, "A", "B", "2016-10-12T12:05:00.000Z"), (4, "D", "C", "2016-10-12T12:30:00.000Z"), (5, "G", "D", "2016-10-12T12:35:00.000Z") ).toDF("nodeId", "typeFrom", "typeTo", "date") df.as("df1").join( df.as("df2"), $"df1.typeFrom" === $"df2.typeTo" ).select( $"df1.nodeId".as("nodeId_1"), $"df2.nodeId".as("nodeId_2"), $"df1.typeFrom".as("type"), $"df1.date" ).show(truncate=false) // +--------+--------+----+------------------------+ // |nodeId_1|nodeId_2|type|date | // +--------+--------+----+------------------------+ // |1 |2 |A |2016-10-12T12:10:00.000Z| // |2 |3 |B |2016-10-12T12:00:00.000Z| // |3 |2 |A |2016-10-12T12:05:00.000Z| // |4 |5 |D |2016-10-12T12:30:00.000Z| // |5 |1 |G |2016-10-12T12:35:00.000Z| // +--------+--------+----+------------------------+ 可以使用xsd.exe-Include <files>个参数,则可以减轻此解决方案。

像这样的伪脚本:

-Exclude <files>

作为一个勤奋的SO&#(我们称之为#34;一个好的小蔬菜&#34;在澳大利亚:),这是我在Powershell中写的完整解决方案。

for i in find . -name "*cs"
do
    className = $i | Replace '.cs', ''
    xsd .\Daff.Lae.TraceCommon.dll /t:$className 
    mv schema0.xsd $className .xsd
done