SerializationException: 'Попытка десериализации пустого потока.'Файл, который я пытаюсь десериализовать, содержит содержимое.Что происходит? - PullRequest
0 голосов
/ 23 февраля 2019

Резюме


Мне дали краткое описание создания программного решения с постоянством.Тем не менее, я обнаружил ошибки в моей сериализации, которые не имеют смысла, так как объект, который я пытаюсь десериализовать, имеет содержимое и не является пустым.Я потратил около 3 часов на разные версии, а также информацию из Интернета, но безуспешно.Извините за большие куски кода, но я не могу найти, где он терпит неудачу.

Ресурсы


Проблема BinaryFormatter & CryptoStream при десериализации

Попытка десериализации пустого потока?

Ошибка времени выполнения Попытка десериализации пустого потока

Документация Microsoft - ISerializable

SerializableAttribute

Код


Десериализация

string userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name.Split('\\')[1];
            string folderName = "c:\\Users\\"+ userName + "\\Documents";
            string pathString = System.IO.Path.Combine(folderName, "Clients");
            System.IO.Directory.CreateDirectory(pathString);
            string[] FileNames = Directory.GetFiles("C:\\Users\\" + userName + "\\Documents\\Clients\\", "*.clnt")
                .Select(System.IO.Path.GetFileName)
                .ToArray();
            if (FileNames.Length > 0)
            {
                for (int Count = 0; Count <= FileNames.Length; ++Count)
                {

                    FileStream s = new FileStream(FileNames[Count] + ".clnt", FileMode.Open, FileAccess.Read);
                    IFormatter formatter = new BinaryFormatter();
                    ClientDataClass Client = (ClientDataClass)formatter.Deserialize(s);
                    s.Close();
                    ClientComboChoice.Items.Add(Client);
                }
            }

        }

Сериализация

protected ClientDataClass(SerializationInfo info, StreamingContext context )
{
    StClientBrief = info.GetString(StClientBrief);
    StClientName = info.GetString(StClientName);
    StClientEmail = info.GetString(StClientEmail);
    StartDate = info.GetDateTime(StartDate.ToString());
    DueDate = info.GetDateTime(DueDate.ToString());
    Price = info.GetDouble(Price.ToString());
    SFW = info.GetBoolean(SFW.ToString());
    Planning = info.GetBoolean(Planning.ToString());
    PlanName = info.GetString(PlanName);
}

//[SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter = true)] Learnt this is obsolete 25/02/2019
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
    info.AddValue("ClientName", StClientName);
    info.AddValue("ClientBrief", StClientBrief);
    info.AddValue("ClientEmail", StClientEmail);
    info.AddValue("StartDate", StartDate);
    info.AddValue("DueDate", DueDate);
    info.AddValue("Price", Price);
    info.AddValue("SFW", SFW);
    info.AddValue("Planning", Planning);
    info.AddValue("Plan Name", PlanName);

}

}

Файл подтверждения содержит:


Proof it has contents

Proof it exists

Попытки


Я пытался изменитьрасширение (соответствует файлу).Я пытался удалить расширение.Я пытался изменить часть сериализации класса данных.

Вопрос


Что не так?Как мне избежать этого в будущем?Как мне это исправить?

1 Ответ

0 голосов
/ 26 февраля 2019

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

Я предполагаю, что вы передаете имя файла в это, но вам действительно нужно передать ввесь путь к файлу.

Попробуйте это.

string[] FileNames = Directory.GetFiles("C:\\Users\\" + userName + "\\Documents\\Clients\\", "*.clnt");
        foreach(string file in FileNames)
{
   FileStream s = new FileStream(file, FileMode.Open, FileAccess.Read);
   IFormatter formatter = new BinaryFormatter();
   ClientDataClass Client = (ClientDataClass)formatter.Deserialize(s);
   s.Close();
   ClientComboChoice.Items.Add(Client);
}

Вы можете проверить имена файлов, выполнив

foreach(string file in FileNames)
{
   Console.WriteLine(file);
   //FileStream s = new FileStream(file, FileMode.Open, FileAccess.Read);
   //IFormatter formatter = new BinaryFormatter();
   //ClientDataClass Client = (ClientDataClass)formatter.Deserialize(s);
   //s.Close();
   //ClientComboChoice.Items.Add(Client);
}

Если вы можете открыть файл, то я думаю,Вы готовы идти дальше, не уверены в операциях сериализации / десериализации, но все выглядит хорошо.

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