ServiceStack.IEnumerable的文本CSV序列化<;对象>;忽略自定义序列化函数

ServiceStack.IEnumerable的文本CSV序列化<;对象>;忽略自定义序列化函数,
Warning: implode(): Invalid arguments passed in /data/phpspider/zhask/webroot/tpl/detail.html on line 45
,,首先,请原谅这里的新手错误——我恐怕不是一个普通的海报 现在让我们来谈谈本质 我正在尝试使用ServiceStack.Text将对象序列化为CSV。如果我保持简单,那么在序列化已知类型的对象时,一切都会按预期进行 但是,我想序列化许多对象,并且我不知道运行时的类型,因此我正在编写一个可重用组件,其中所有数据都被视为System.Object。我们已经为Json序列化执行了相同的例程,没有任何问题。但是CsvSerializer在序列化过程中处理对象的方式似乎有所不同 示例代码 到目前为止,我还没

首先,请原谅这里的新手错误——我恐怕不是一个普通的海报

现在让我们来谈谈本质

我正在尝试使用ServiceStack.Text将对象序列化为CSV。如果我保持简单,那么在序列化已知类型的对象时,一切都会按预期进行

但是,我想序列化许多对象,并且我不知道运行时的类型,因此我正在编写一个可重用组件,其中所有数据都被视为
System.Object
。我们已经为Json序列化执行了相同的例程,没有任何问题。但是
CsvSerializer
在序列化过程中处理对象的方式似乎有所不同

示例代码 到目前为止,我还没有遇到这个更改的问题,尽管有人可能不希望在return语句之前分配一个新的中间变量

希望这是足够的信息,所以我的问题

  • 还有其他人经历过这个问题吗

  • 我是否做错了什么,是否应该以不同的方式序列化对象

  • 如果这是TypeSerializer的合适修复/实现,那么在ServiceStack.Text的更新中解决这一问题的可能性有多大?我会在GitHub上提出问题,但ServiceStack.Text repo不允许我提出问题


  • 提前感谢。

    @mythz。。。您知道如何为ServiceStack.Text运行NUnit测试吗?VS2017中的NUnit 3测试适配器扩展无法加载测试-可能是由于新的项目格式?测试资源管理器中显示的唯一测试是ServiceStack.Text.Tests.xUnit中的单个测试。您可以使用R#NUnit测试运行程序,因为它们有一个。您还可以使用ServiceStack.Text.tests.dllCheers上的运行测试,该更改可从现在的v4.5.13+版本中获得
        public void TestIEnumerableObjectSerialization()
        {
            var data = GenerateSampleData();
    
            JsConfig<DateTime>.SerializeFn = 
                time => new DateTime(time.Ticks, DateTimeKind.Utc).ToString("yyyy-MM-dd HH:mm:ss");
    
            var csv = CsvSerializer.SerializeToCsv(data);
            Console.WriteLine(csv);
    
            Assert.Equal("DateTime\r\n"
                + "2017-06-14 00:00:00\r\n"
                + "2017-01-31 01:23:45\r\n",
                csv);
        }
    
        object[] GenerateSampleData()
        {
            return new object[] {
                new POCO
                {
                    DateTime = new DateTime(2017,6,14)
                },
                new POCO
                {
                    DateTime = new DateTime(2017,1,31, 01, 23, 45)
                }
             };
        }
    
        public class POCO
        {
            public DateTime DateTime { get; set; }
        }
    
        public static object ToCsvField(this object text)
        {
            var textSerialized = TypeSerializer.SerializeToString(text).StripQuotes();
            return textSerialized == null || !CsvWriter.HasAnyEscapeChars(textSerialized)
                ? textSerialized
                : string.Concat
                  (
                      CsvConfig.ItemDelimiterString,
                      textSerialized.Replace(CsvConfig.ItemDelimiterString, CsvConfig.EscapedItemDelimiterString),
                      CsvConfig.ItemDelimiterString
                  );
        }