Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何查找磁盘上使用BinaryFormatter序列化的文件的第n条记录_C#_.net - Fatal编程技术网

C# 如何查找磁盘上使用BinaryFormatter序列化的文件的第n条记录

C# 如何查找磁盘上使用BinaryFormatter序列化的文件的第n条记录,c#,.net,C#,.net,我需要覆盖包含相同对象的文件中的特定记录,该文件以前是使用BinaryFormatter序列化的 如何将流位置提前到第n个记录,然后仅覆盖该记录 或者,换一种说法,我如何确定序列化的每个对象的增量“Seek”。我找到了一种方法来确定当要移动到第n条记录时,每个记录的Seek位置必须移动的大小: 假设传递给下面的SerializedObjectSize函数的文件fileName最初是使用二进制格式化程序序列化为目标对象文件的,则该函数将返回随机访问磁盘/流上文件内任何记录所需的搜索增量 long

我需要覆盖包含相同对象的文件中的特定记录,该文件以前是使用BinaryFormatter序列化的

如何将流位置提前到第n个
记录,然后仅覆盖该记录


或者,换一种说法,我如何确定序列化的每个对象的增量“Seek”。

我找到了一种方法来确定当要移动到第n条记录时,每个记录的Seek位置必须移动的大小:

假设传递给下面的SerializedObjectSize函数的文件fileName最初是使用二进制格式化程序序列化为目标对象文件的,则该函数将返回随机访问磁盘/流上文件内任何记录所需的搜索增量

long SerializedObjectSize(string fileName) {

    using (FileStream fs = new FileStream(fileName, FileMode.Open))
    {
        var bf = new BinaryFormatter();
        var discardObject = (Target)bf.Deserialize(fs);
        return fs.Position;
    }  

}

有点难说,因为很难提前知道记录的大小。您最好使用protobufy您可能需要检查,因为通常在第一次序列化类型时,会写出额外的类型信息,从而使第一条记录比其他记录大。它可能取决于所使用的序列化程序和格式化程序