gpt4 book ai didi

c# - 存储 FileInfo 实体时 SisoDB 的 StackOverflow 异常

转载 作者:太空宇宙 更新时间:2023-11-03 21:57:46 26 4
gpt4 key购买 nike

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

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

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 异常。知道为什么会这样吗?我该如何克服这个问题?

最佳答案

SisoDb 依赖于 ServiceStack.Text 的高性能和出色的序列化框架,我的第一个测试是看它是否可以序列化 FileInfo。 ,这就是 StackOverFlowException 的位置好像是生成的您可以使用 SisoDb.Serialization 来尝试此操作(这是 ServiceStack.Text 的副本)或直接使用 ServiceStack.Text。

var json = info.ToJson();

截至目前 InsertAs<T>需要 T成为一个界面。 Insert<T>InsertMany<T>可以处理接口(interface),但也需要实际项目来实现接口(interface)。

到目前为止,为了更进一步:

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) 或者你可以制作FileData包装 FileInfo

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

关于c# - 存储 FileInfo 实体时 SisoDB 的 StackOverflow 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11522186/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com