CSV序列化继承的类型

时间:2014-02-22 18:42:13

标签: c# inheritance csv servicestack servicestack-text

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

我正在使用继承,特别是抽象类,并且不输出子类型的属性。是的我知道this是一个坏主意,但因为我没有必要对类型进行反序列化,而且我没有制作公共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序列化器输出所有子属性?

1 个答案:

答案 0 :(得分:1)

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);
}