C # десериализовать нумерацию страниц - PullRequest
0 голосов
/ 24 октября 2018

У меня большой список объектов, которые необходимо отобразить в таблице HTML.Я получаю список с помощью BinaryFormatter следующим образом:

IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream("MyFile.bin", FileMode.Open, FileAccess.Read, FileShare.Read);
MyObject obj = (MyObject) formatter.Deserialize(fromStream);
stream.Close();

Может ли метод Deserialize () вернуть первые 100 записей, а затем следующие 100 и т. Д.?

1 Ответ

0 голосов
/ 24 октября 2018

Может ли метод Deserialize () вернуть первые 100 записей, а затем следующие 100 и т. Д.?

Краткий ответ - нет.

1) Однако вы можете либопошагово просматривайте десериализованные объекты, такие как адреса, указанные ниже:

using System;
using System.IO;
using System.Collections;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;

public class App 
{
    [STAThread]
    static void Main() 
    {
        Serialize();
        Deserialize();
    }

    static void Serialize() 
    {
        // Create a hashtable of values that will eventually be serialized.
        Hashtable addresses = new Hashtable();
        addresses.Add("Jeff", "123 Main Street, Redmond, WA 98052");
        addresses.Add("Fred", "987 Pine Road, Phila., PA 19116");
        addresses.Add("Mary", "PO Box 112233, Palo Alto, CA 94301");

        // To serialize the hashtable and its key/value pairs,  
        // you must first open a stream for writing. 
        // In this case, use a file stream.
        FileStream fs = new FileStream("DataFile.dat", FileMode.Create);

        // Construct a BinaryFormatter and use it to serialize the data to the stream.
        BinaryFormatter formatter = new BinaryFormatter();
        try 
        {
            formatter.Serialize(fs, addresses);
        }
        catch (SerializationException e) 
        {
            Console.WriteLine("Failed to serialize. Reason: " + e.Message);
            throw;
        }
        finally 
        {
            fs.Close();
        }
    }


    static void Deserialize() 
    {
        // Declare the hashtable reference.
        Hashtable addresses  = null;

        // Open the file containing the data that you want to deserialize.
        FileStream fs = new FileStream("DataFile.dat", FileMode.Open);
        try 
        {
            BinaryFormatter formatter = new BinaryFormatter();

            // Deserialize the hashtable from the file and 
            // assign the reference to the local variable.
            addresses = (Hashtable) formatter.Deserialize(fs);
        }
        catch (SerializationException e) 
        {
            Console.WriteLine("Failed to deserialize. Reason: " + e.Message);
            throw;
        }
        finally 
        {
            fs.Close();
        }

        // To prove that the table deserialized correctly, 
        // display the key/value pairs.
        foreach (DictionaryEntry de in addresses) 
        {
            Console.WriteLine("{0} lives at {1}.", de.Key, de.Value);
        }
    }
}

2) Во-первых, выберите другой подход для кодирования ваших двоичных данных, чтобы вы могли последовательно читать их по мере необходимости.Так, например, вы могли бы написать собственный сериализатор, который сначала выдает число байтов для чтения в виде последовательности байтов в зависимости от размера объекта, который вы передаете в потоковом режиме, поэтому некоторый базовый код будет:

int read = stream.Read(data, offset, remaining);

Фактически, написание собственного сериализатора, чтобы вы знали , как сериализуются данные, и чтобы вы могли десериализовать их по частям, как вам нужно, вероятно, стоит усилий, если это ваше требование.

3) Положитесь на сторонний пакет, который эффективно сериализует ваши данные и позволяет вам последовательно читать вещи.Там есть куча, просто Googling найдет кучу, но вы можете взглянуть на Google Protocol Buffers, который является эффективным по размеру и быстрымСм. https://developers.google.com/protocol-buffers/docs/csharptutorial, в котором есть несколько примеров некоторых вещей, которые я обсуждал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...