1

这个问题是指SisoDB - 一个用 C# 编写的基于 SQL-Server 的文档数据库。

我正在尝试将 FileInfo 实体存储到数据库中。为了避免(潜在的)循环引用,我为我需要的字段定义了接口:

interface IFileData
{
    Guid Id { get; set; }
    string DirectoryName { get; set; }
    long Length { get; set; }
    string Name { get; set; }
}

然后尝试存储一个 FileInfo 实体:

        var db = @"Data Source=C:\Temp\sisotest.sdf".CreateSqlCe4Db();
        db.EnsureNewDatabase();

        var info = new FileInfo(@"c:\config.sys");
        db.UseOnceTo().InsertAs<IFileData>(info);

这会导致 StackOverflow 异常。任何想法为什么会这样,我该如何克服这个问题?

4

1 回答 1

4

SisoDb 依赖于 ServiceStack.Text 的高性能和出色的序列化框架,我的第一个测试是查看它是否可以序列化 a FileInfo,而这StackOverFlowException似乎是生成的地方。您可以通过使用SisoDb.Serialization(ServiceStack.Text 的副本)或直接使用 ServiceStack.Text 来尝试此操作。

var json = info.ToJson();

截至目前InsertAs<T>需要T是一个接口。Insert<T>并且InsertMany<T>可以处理接口,但也需要实际的item来实现接口。

所以到目前为止,为了进一步:

1)IFileData.

public class FileData
{
    public Guid Id { get; set; }
    public string DirectoryName { get; set; }
    public long Length { get; set; }
    public string Name { get; set; }
}

2)通常应该没问题,但是由于FileInfo无法序列化为JSON,因此您需要:

a)告诉 ServiceStack 序列化程序(包含在 SisoDb.Serialization 中)不要包含导致反序列化问题的属性:

JsConfig<FileInfo>.ExcludePropertyNames = new[]{"Directory"};

b)或者你可以做FileDatawrap aFileInfo

c)或者您可以制作一个自定义包装器FileInfo2来包装FileInfo.

class Program
{
    static void Main(string[] args)
    {
        var db = @"Data Source=D:\Temp\sisotest.sdf".CreateSqlCe4Db();
        db.EnsureNewDatabase();

        var info = new FileInfo2(@"D:\Temp\test.txt");
        db.UseOnceTo().InsertAs<FileData>(info);
    }
}

public class FileInfo2
{
    public FileInfo2(string cConfigSys)
    {
        var f = new FileInfo(cConfigSys);
        DirectoryName = f.DirectoryName;
        Length = f.Length;
        Name = f.Name;
    }

    public string DirectoryName { get; private set; }
    public long Length { get; private set; }
    public string Name { get; private set; }
}

public class FileData
{
    public Guid Id { get; set; }
    public string DirectoryName { get; set; }
    public long Length { get; set; }
    public string Name { get; set; }
}
于 2012-07-17T22:32:10.137 回答