C# 将队列保存到文件,然后加载它并与原始队列进行比较

C# 将队列保存到文件,然后加载它并与原始队列进行比较,c#,serialization,queue,compare,C#,Serialization,Queue,Compare,我在将队列保存到文件中时遇到问题,随后将其加载到新队列中,然后将旧队列与新队列进行比较 我有一个简单的TestMessageClass,现在我想序列化队列并将其保存到一个名为test.bin的文件中。我认为工作正常,但当我将队列加载到另一个变量中并比较它们时,会出现以下错误: Expected: equivalent to Grid.NodeTests.MessageSink_Tests.MessageSinkTests+TestMessageClass, Grid.NodeTests.M

我在将队列保存到文件中时遇到问题,随后将其加载到新队列中,然后将旧队列与新队列进行比较

我有一个简单的TestMessageClass,现在我想序列化队列并将其保存到一个名为test.bin的文件中。我认为工作正常,但当我将队列加载到另一个变量中并比较它们时,会出现以下错误:

Expected: equivalent to 

Grid.NodeTests.MessageSink_Tests.MessageSinkTests+TestMessageClass, 
Grid.NodeTests.MessageSink_Tests.MessageSinkTests+TestMessageClass, 
Grid.NodeTests.MessageSink_Tests.MessageSinkTests+TestMessageClass, 
Grid.NodeTests.MessageSink_Tests.MessageSinkTests+TestMessageClass, 
Grid.NodeTests.MessageSink_Tests.MessageSinkTests+TestMessageClass, 
Grid.NodeTests.MessageSink_Tests.MessageSinkTests+TestMessageClass, 
Grid.NodeTests.MessageSink_Tests.MessageSinkTests+TestMessageClass, 
Grid.NodeTests.MessageSink_Tests.MessageSinkTests+TestMessageClass, 
Grid.NodeTests.MessageSink_Tests.MessageSinkTests+TestMessageClass, 
Grid.NodeTests.MessageSink_Tests.MessageSinkTests+TestMessageClass


But was:


Grid.NodeTests.MessageSink_Tests.MessageSinkTests+TestMessageClass, 
Grid.NodeTests.MessageSink_Tests.MessageSinkTests+TestMessageClass, 
Grid.NodeTests.MessageSink_Tests.MessageSinkTests+TestMessageClass, 
Grid.NodeTests.MessageSink_Tests.MessageSinkTests+TestMessageClass, 
Grid.NodeTests.MessageSink_Tests.MessageSinkTests+TestMessageClass, 
Grid.NodeTests.MessageSink_Tests.MessageSinkTests+TestMessageClass, 
Grid.NodeTests.MessageSink_Tests.MessageSinkTests+TestMessageClass, 
Grid.NodeTests.MessageSink_Tests.MessageSinkTests+TestMessageClass, 
Grid.NodeTests.MessageSink_Tests.MessageSinkTests+TestMessageClass, 
Grid.NodeTests.MessageSink_Tests.MessageSinkTests+TestMessageClass
如果我使用普通字符串排队,那么一切都可以正常工作,但是如果我使用TestMessageClass,它将不再工作

[Serializable()]
class TestMessageClass
{
    public enum MessageType
    { 
        Broadcast,
        Unicast
    }
}

internal interface ISerializationService
{
      void Serialize(Stream outputStream, object obj);
      T Deserialize<T>(Stream inputStream);
}

public void Serialize(Stream outputStream, Object obj)
{

    IFormatter serializer = new BinaryFormatter();
    serializer.Serialize(outputStream, obj);


}

public T Deserialize<T>(Stream inputStream)
{

    var result = new BinaryFormatter().Deserialize(inputStream);

    return (T)result;

}
[Test]
public void CompareQueue()
{
    Queue queue1 = new Queue();

    var message = new TestMessageClass();

    for (int i = 0; i < 100; i++)
        queue1.Enqueue(message);

    ISerializationService service = new SerializationService();

    FileStream stream = File.Open("Test.bin" , FileMode.Create , FileAccess.Write);

    service.Serialize(stream, queue1);
    stream.Close();

    FileStream stream2 = File.Open("Test.bin" , FileMode.Open ,FileAccess.Read);

    Queue queue2 = service.Deserialize<Queue>(stream2);
    stream2.Close();
    CollectionAssert.AreEquivalent(queue1,queue2);

}
[Serializable()]
类TestMessageClass
{
公共枚举消息类型
{ 
广播,,
单播
}
}
内部接口ISerialization服务
{
void序列化(Stream outputStream,object obj);
T反序列化(流输入流);
}
public void序列化(Stream outputStream,Object obj)
{
IFormatter序列化程序=新的BinaryFormatter();
序列化(outputStream,obj);
}
公共T反序列化(流输入流)
{
var result=new BinaryFormatter()。反序列化(inputStream);
返回(T)结果;
}
[测试]
公共空白比较表()
{
队列1=新队列();
var message=newtestmessageclass();
对于(int i=0;i<100;i++)
queue1.排队(消息);
ISerializationService=新的SerializationService();
FileStream stream=File.Open(“Test.bin”、FileMode.Create、FileAccess.Write);
序列化(流,队列1);
stream.Close();
FileStream stream2=File.Open(“Test.bin”,FileMode.Open,FileAccess.Read);
Queue queue2=服务。反序列化(stream2);
stream2.Close();
CollectionAssert.AreEquivalent(队列1、队列2);
}

最简单的解决方案是在TestMessageClass上实现Equals,以确定两个不同的实例是否相等。通常,您可以通过比较每个实例上的所有属性来实现该方法

当您序列化它然后反序列化它时,它将创建新实例,因此默认的Equals实现将返回false,因为它只是比较实例是否相同