C#没有全部归还' FileInfo' API调用中的属性

时间:2017-10-23 17:19:15

标签: c#

给出以下API函数:

public IHttpActionResult GetDirFiles(string dir)
{
    DirectoryInfo directory = new DirectoryInfo(dir);

    if (directory.Exists)
    {
        IEnumerable<FileInfo> files = directory.EnumerateFiles();
        return Ok(files);
    }
    else
    {
        return NotFound();
    }
}

当我用&#34; D:\&#34;来称呼它时,我会收到以下回复

[
    {
        "OriginalPath": "DisableReadOnly.bat",
        "FullPath": "D:\\DisableReadOnly.bat"
    },
    {
        "OriginalPath": "KillDotNet.bat",
        "FullPath": "D:\\KillDotNet.bat"
    }
]

但是在调试时,当调用return时, files 对象会显示所有FileInfo属性:

enter image description here

为什么只有OriginalPath&amp;虽然返回了FullPath属性?

1 个答案:

答案 0 :(得分:2)

这是因为FileInfoFileSystemInfo的基类实现了接口ISerializable,它控制了类的序列化方式。查看FileSystemInfo.GetObjectData(...)的源代码:

public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
{
    FileIOPermission.QuickDemand(FileIOPermissionAccess.PathDiscovery, this.FullPath, false, true);
    info.AddValue("OriginalPath", this.OriginalPath, typeof(string));
    info.AddValue("FullPath", this.FullPath, typeof(string));
}

请注意,这些是序列化结果中的两个属性。因此,如果您需要FileInfo的额外属性,则需要创建自己的类,将FileInfo的属性映射到您的类,并序列化 。< / p>

来自Newtonsoft's documentation on ISerializable

  

实现ISerializable的类型被序列化为JSON对象。序列化时,仅使用从ISerializable.GetObjectData返回的值;该类型的成员将被忽略。反序列化时,调用带有Seri​​alizationInfo和StreamingContext的构造函数,传递JSON对象的值。

     

在不需要此行为的情况下,可以将JsonObjectAttribute放置在实现ISerializable的.NET类型上,以强制将其序列化为普通的JSON对象。