1

この質問は、C# で記述された SQL Server ベースのドキュメント データベースであるSisoDBに関するものです。

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>処理できますが、インターフェイスを実装するには実際のアイテムも必要です。

したがって、今のところ、さらに進めるには:

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; }
}
于 2012-07-17T22:32:10.137 に答える