Как выполнить сериализацию / десериализацию объекта модульного теста в VB.NET 1.1?

Я ищу пример кода, который предоставляет модульный тест для сериализации и десериализации объекта из потока памяти. Я нашел примеры с использованием C # 2.0, однако в моем текущем проекте используется VB.NET 1.1 (не спрашивайте меня, почему ...), поэтому решение не может использовать дженерики. Я также использую фреймворк NUnit для модульных тестов.

Спасибо!


person Technobabble    schedule 18.11.2008    source источник


Ответы (4)


Я остановился на этом образце:

<Test()> _
Public Sub SerializationTest()
    Dim obj As New MySerializableObject()
    'Perform additional construction as necessary

    Dim obj2 As MySerializableObject
    Dim formatter As New BinaryFormatter
    Dim memoryStream As New MemoryStream()

    'Run through serialization process
    formatter.Serialize(memoryStream, obj)
    memoryStream.Seek(0, SeekOrigin.Begin)
    obj2 = DirectCast(formatter.Deserialize(memoryStream), MySerializableObject)

    'Test for equality using Assert methods
    Assert.AreEqual(obj.Property1, obj.Property1)
    'etc...
End Sub
person Technobabble    schedule 30.06.2009
comment
Это похоже на тот случай, когда использование теорий было бы полезным. Из shareandenjoy.saff.net/tdd-specifications.pdf (который использует Java / Junit примеры, но концепции в NUnit те же): По нашему опыту, хорошие теории обычно являются своего рода идентичностями. Если для записи идентификатора необходимо добавить метод, он обычно заполняет очевидный пробел в существующем API. В этом случае идентичность: Когда я сериализую объект, а затем создаю новый, десериализуя этот вывод, новый объект должен быть идентичен исходному. См. nunit.org/index.php?p=theory&r=2.5.5. - person MatrixFrog; 09.06.2010

NUnit имеет встроенную поддержку для этого, что значительно упрощает задачу:

Dim obj As New MySerializableObject()
Assert.That(obj, Is.BinarySerializable)

Или для xml:

Dim obj As New MySerializableObject()
Assert.That(obj, Is.XmlSerializable)
person Patrik Hägne    schedule 12.11.2009
comment
Я никогда не знал об этом до сих пор, просто использовал, намного лучше :) - person MJJames; 02.12.2009

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

[Test]
public void ClassIsXmlSerializable()
{
   bool exceptionWasThrown = false;

   try
   {
      // .. serialize object
   }
   catch(XmlSerializationException ex)
   {
      exceptionWasThrown = true;
   }

   Asset.IsFalse(exceptionWasThrown, "An XmlSerializationException was thrown. The type xx is not xml serializable!");
}
person TheCodeJunkie    schedule 18.11.2008
comment
Извините, я не видел, что вы используете VB.NET ... дайте мне знать, если вы хотите, чтобы я перевел его на VB.NET для вас - person TheCodeJunkie; 18.11.2008
comment
Нет необходимости, я с комфортом читаю C #. Однако я сталкивался с некоторыми случаями, когда VB.NET и C # значительно различаются по определенным функциям (например, при использовании объявления атрибута [field: NonSerialized], которое, похоже, не поддерживается в VB.NET). - person Technobabble; 18.11.2008
comment
Если это было решение вашей проблемы, сделайте это как ответ - person TheCodeJunkie; 18.11.2008

Хм ... так вы пытаетесь написать модульный тест на сериализацию? Или для потоков? Надеюсь, это уже сделано MS ... но если вы не доверяете или не реализуете что-то самостоятельно ... вы можете просто заполнить объект некоторыми данными, сохранить его, восстановить и проверить, находятся ли значения полей на месте ?

person Paul Kapustin    schedule 18.11.2008
comment
Вот, по сути, то, что я пытаюсь сделать, но в VB.NET 1.1: stackoverflow.com/questions/236599/ - person Technobabble; 18.11.2008