C# 解析完成前遇到流结束

C# 解析完成前遇到流结束,c#,C#,我正在尝试使用以下代码从文件中读取多个对象: List<Alarm> list = new List<Alarm>(); BinaryFormatter serializer = new BinaryFormatter(); using (FileStream stream = File.OpenRead("//my File here")) { while (stream.Position < stream.Length) { l

我正在尝试使用以下代码从文件中读取多个对象:

List<Alarm> list = new List<Alarm>();
BinaryFormatter serializer = new BinaryFormatter();

using (FileStream stream = File.OpenRead("//my File here"))
{
    while (stream.Position < stream.Length)
    {
        list.Add((Alarm)serializer.Deserialize(stream));
    }
}

如果您序列化的是
报警
s列表(而不是一系列单独的
报警
s),这是非常可能的,那么您只需反序列化:

using (FileStream stream = File.OpenRead("//my File here"))
{
   list = (List<Alarm>)serializer.Deserialize(stream));
}

如果您序列化的是
报警
s列表(而不是一系列单独的
报警
s),这是非常可能的,那么您只需反序列化:

using (FileStream stream = File.OpenRead("//my File here"))
{
   list = (List<Alarm>)serializer.Deserialize(stream));
}
这是如何使用BinaryFormatter序列化/反序列化对象的证明:
列表ls=新列表();
ls.添加(“aaa”);
ls.添加(“Bb”);
BinaryFormatter bf=新的BinaryFormatter();
var fileName=Guid.NewGuid().ToString().Replace(“-”,”);
var path=path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData),文件名);
尝试
{
使用(var fs=new FileStream(path,FileMode.OpenOrCreate,FileAccess.Write))
{
序列化(fs,ls);
}
使用(var fs=new FileStream(路径,FileMode.Open,FileAccess.Read))
{
ls=bf。反序列化(fs)为列表;
}
}
最后
{
如果(File.Exists(path))
{
尝试
{
删除(路径);
}
接住
{
}
}
}
这是如何使用BinaryFormatter序列化/反序列化对象的证明:
列表ls=新列表();
ls.添加(“aaa”);
ls.添加(“Bb”);
BinaryFormatter bf=新的BinaryFormatter();
var fileName=Guid.NewGuid().ToString().Replace(“-”,”);
var path=path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData),文件名);
尝试
{
使用(var fs=new FileStream(path,FileMode.OpenOrCreate,FileAccess.Write))
{
序列化(fs,ls);
}
使用(var fs=new FileStream(路径,FileMode.Open,FileAccess.Read))
{
ls=bf。反序列化(fs)为列表;
}
}
最后
{
如果(File.Exists(path))
{
尝试
{
删除(路径);
}
接住
{
}
}
}

看起来您只需要在序列化之前将报警添加到报警列表中。这很有效,而且似乎可以满足您的需求:

void Main()
{
    List<Alarm> listYouSerializeInto = new List<Alarm>();
    listYouSerializeInto.Add(new Alarm("test", 2015, 07, 29, 06, 00));
    listYouSerializeInto.Add(new Alarm("test", 2015, 07, 29, 07, 00));
    listYouSerializeInto.Add(new Alarm("test", 2015, 07, 29, 08, 00));

    var serializer = new BinaryFormatter();

    using (FileStream stream = new FileStream(@"C:\Temp\alarm.bin", FileMode.Create))
    {
        serializer.Serialize(stream, listYouSerializeInto);
    }

    List<Alarm> listYouDeserializeInto = new List<Alarm>(); 
    using (Stream stream = new FileStream(@"C:\Temp\alarm.bin", FileMode.Open))
    {

        listYouDeserializeInto = (List<Alarm>)serializer.Deserialize(stream);
        foreach (Alarm a in listYouDeserializeInto)
        {
            Console.WriteLine(a);
        }


    }



}

// Define other methods and classes here
[Serializable]
public class Alarm {
    public string Text { get; set;}
    public int Year { get; set;}
    public int Month { get; set;}
    public int Day { get; set;}
    public int Hour { get; set;}
    public int Minute { get; set;}

    public Alarm (string text, int year, int month, int day, int hour, int minute)
    {
        Text = text;
        Year = year;
        Month = month;
        Day = day;
        Hour = hour;
        Minute = minute;
    }

}
void Main()
{
List listYouSerializeInto=新列表();
添加(新报警(“测试”),2015,07,29,06,00);
添加(新报警(“测试”),2015,07,29,07,00);
添加(新报警(“测试”),2015,07,29,08,00);
var serializer=新的二进制格式化程序();
使用(FileStream stream=newfilestream(@“C:\Temp\alarm.bin”,FileMode.Create))
{
serializer.Serialize(流,listYouSerializeInto);
}
List listYouDeserializeInto=新列表();
使用(Stream-Stream=newfilestream(@“C:\Temp\alarm.bin”,FileMode.Open))
{
listYouDeserializeInto=(列表)序列化程序。反序列化(流);
foreach(listYouDeserializeInto中的报警a)
{
控制台写入线(a);
}
}
}
//在此处定义其他方法和类
[可序列化]
公共类警报{
公共字符串文本{get;set;}
公共整数年{get;set;}
公共整数月{get;set;}
公共整数日{get;set;}
公共整数小时{get;set;}
公共整数分钟{get;set;}
公共警报(字符串文本、整数年、整数月、整数天、整数小时、整数分钟)
{
文本=文本;
年=年;
月=月;
天=天;
小时=小时;
分钟=分钟;
}
}

看起来您只需要在序列化之前将报警添加到报警列表中。这很有效,而且似乎可以满足您的需求:

void Main()
{
    List<Alarm> listYouSerializeInto = new List<Alarm>();
    listYouSerializeInto.Add(new Alarm("test", 2015, 07, 29, 06, 00));
    listYouSerializeInto.Add(new Alarm("test", 2015, 07, 29, 07, 00));
    listYouSerializeInto.Add(new Alarm("test", 2015, 07, 29, 08, 00));

    var serializer = new BinaryFormatter();

    using (FileStream stream = new FileStream(@"C:\Temp\alarm.bin", FileMode.Create))
    {
        serializer.Serialize(stream, listYouSerializeInto);
    }

    List<Alarm> listYouDeserializeInto = new List<Alarm>(); 
    using (Stream stream = new FileStream(@"C:\Temp\alarm.bin", FileMode.Open))
    {

        listYouDeserializeInto = (List<Alarm>)serializer.Deserialize(stream);
        foreach (Alarm a in listYouDeserializeInto)
        {
            Console.WriteLine(a);
        }


    }



}

// Define other methods and classes here
[Serializable]
public class Alarm {
    public string Text { get; set;}
    public int Year { get; set;}
    public int Month { get; set;}
    public int Day { get; set;}
    public int Hour { get; set;}
    public int Minute { get; set;}

    public Alarm (string text, int year, int month, int day, int hour, int minute)
    {
        Text = text;
        Year = year;
        Month = month;
        Day = day;
        Hour = hour;
        Minute = minute;
    }

}
void Main()
{
List listYouSerializeInto=新列表();
添加(新报警(“测试”),2015,07,29,06,00);
添加(新报警(“测试”),2015,07,29,07,00);
添加(新报警(“测试”),2015,07,29,08,00);
var serializer=新的二进制格式化程序();
使用(FileStream stream=newfilestream(@“C:\Temp\alarm.bin”,FileMode.Create))
{
serializer.Serialize(流,listYouSerializeInto);
}
List listYouDeserializeInto=新列表();
使用(Stream-Stream=newfilestream(@“C:\Temp\alarm.bin”,FileMode.Open))
{
listYouDeserializeInto=(列表)序列化程序。反序列化(流);
foreach(listYouDeserializeInto中的报警a)
{
控制台写入线(a);
}
}
}
//在此处定义其他方法和类
[可序列化]
公共类警报{
公共字符串文本{get;set;}
公共整数年{get;set;}
公共整数月{get;set;}
公共整数日{get;set;}
公共整数小时{get;set;}
公共整数分钟{get;set;}
公共警报(字符串文本、整数年、整数月、整数天、整数小时、整数分钟)
{
文本=文本;
年=年;
月=月;
天=天;
小时=小时;
分钟=分钟;
}
}

您能否提供一个简短但完整的程序来演示问题,包括编写文件的代码?您是否考虑过另一种方法查看此帖子有多少个对象成功进入列表?应该有多少个对象?你是如何序列化列表的?作为一个洞列表?如果是这样,您只需将所有文件内容读入一个字节数组并调用一次反序列化。更不用说我建议在你的文件流上使用StreamReader。你的Alarm类代码在哪里?请提供你能提供一个简短的
void Main()
{
    List<Alarm> listYouSerializeInto = new List<Alarm>();
    listYouSerializeInto.Add(new Alarm("test", 2015, 07, 29, 06, 00));
    listYouSerializeInto.Add(new Alarm("test", 2015, 07, 29, 07, 00));
    listYouSerializeInto.Add(new Alarm("test", 2015, 07, 29, 08, 00));

    var serializer = new BinaryFormatter();

    using (FileStream stream = new FileStream(@"C:\Temp\alarm.bin", FileMode.Create))
    {
        serializer.Serialize(stream, listYouSerializeInto);
    }

    List<Alarm> listYouDeserializeInto = new List<Alarm>(); 
    using (Stream stream = new FileStream(@"C:\Temp\alarm.bin", FileMode.Open))
    {

        listYouDeserializeInto = (List<Alarm>)serializer.Deserialize(stream);
        foreach (Alarm a in listYouDeserializeInto)
        {
            Console.WriteLine(a);
        }


    }



}

// Define other methods and classes here
[Serializable]
public class Alarm {
    public string Text { get; set;}
    public int Year { get; set;}
    public int Month { get; set;}
    public int Day { get; set;}
    public int Hour { get; set;}
    public int Minute { get; set;}

    public Alarm (string text, int year, int month, int day, int hour, int minute)
    {
        Text = text;
        Year = year;
        Month = month;
        Day = day;
        Hour = hour;
        Minute = minute;
    }

}