给出以下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属性:
为什么只有OriginalPath&amp;虽然返回了FullPath属性?
答案 0 :(得分:2)
这是因为FileInfo
,FileSystemInfo
的基类实现了接口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返回的值;该类型的成员将被忽略。反序列化时,调用带有SerializationInfo和StreamingContext的构造函数,传递JSON对象的值。
在不需要此行为的情况下,可以将JsonObjectAttribute放置在实现ISerializable的.NET类型上,以强制将其序列化为普通的JSON对象。