c# - 继承类型的 CSV 序列化

标签 c# inheritance csv servicestack servicestack-text

我正在尝试使用 ServiceStack.Text 库将一些记录序列化为 CSV。

我正在使用继承,特别是抽象类,子类型的属性没有被输出。是的,我知道this这是一个坏主意,但因为我不需要反序列化类型,而且我没有制作公共(public) API。无论如何,文档似乎支持这种情况。

对于这个例子:

public abstract class ResultBase
{
    public int MinuteOffset { get; set; }
    public double SegmentDuration { get; set; }
}

public class EventIndex : IndexBase
{
    public int EventsTotal { get; set; }
    public int EventsTotalThresholded { get; set; } 
}

以及要序列化的代码:

var destination = new FileInfo("C:\\somefile.txt")
using (var stream =  destination.CreateText())
{
    JsvStringSerializer s = new JsvStringSerializer();
    var o = s.SerializeToString(results);
     stream.Write(o);

    CsvSerializer.SerializeToWriter(results, stream);
}

CSV 序列化器输出这个(不是我想要的):

MinuteOffset,SegmentDuration
0,0

但是,JSV 序列化器的行为似乎符合预期:

[{__type:"AnalysisBase.EventIndex, AnalysisBase",EventsTotal:0,EventsTotalThresholded:0,MinuteOffset:0,SegmentDuration:0}]

为什么字段输出存在差异,我是否可以让 CSV 序列化程序输出所有子属性?

最佳答案

CsvSerializer.SerializeToWriter 是一种通用方法,不对对象的运行时类型进行操作。如果您通过当前实例的基类型调用序列化,那么序列化器现在不会再有任何其他属性,然后是基类型。

public static void SerializeToWriter<T>(T value, TextWriter writer)
{
    if (value == null) return;
    if (typeof(T) == typeof(string))
    {
        writer.Write(value);
        return;
    }
    CsvSerializer<T>.WriteObject(writer, value);
}

关于c# - 继承类型的 CSV 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21958724/

相关文章:

javascript - 我需要使用什么语法来将临时数组添加到等同于通用字符串列表的对象成员?

java - 具有抽象类的 JPA 实体继承 - ConstrainViolationException

c++ - 从派生实例的基类调用派生类中的内联成员

c# - htmlunit .net MVC View 单元测试

c# - WPF,在C#中从XmlDataProvider中读取数据

c++ - 从递归模板类继承

Powershell 过滤器 csv

csv - 使用节点 csv 和关系 csv 创建关系

excel - Workbooks.OpenText 无法正确解析 csv 文件 Excel 2016

c# - Chrome 圆 Angular css?