Некоторые основные типы (DateTime
- отмечая, в частности, "kind" или Decimal
, отмечая масштаб) могут иметь значения, которые сообщают как равные, но которые сериализуются по-разному; например:
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
[Serializable]
class Foo
{
public decimal Bar { get; set; }
static void Main()
{
Foo foo = new Foo();
foo.Bar = 123.45M;
var s = Serialize(foo);
Foo foo2 = new Foo();
foo2.Bar = 123.4500M;
bool areSame = foo.Bar == foo2.Bar; // true
var s2 = Serialize(foo2);
bool areSerializedTheSame = s == s2; // false
}
static string Serialize(object obj)
{
using (var ms = new MemoryStream())
{
new BinaryFormatter().Serialize(ms, obj);
return Convert.ToBase64String(ms.GetBuffer(), 0, (int)ms.Length);
}
}
}
Относительно того, может ли точный один и тот же объект сериализоваться по-разному - ну, обычно это не гарантия того, что сериализация делает какие-либо претензии. Сериализация - это хранение и извлечение ваших данных / объектов - , а не о доказательстве равенства. Например, xml имеет все виды проблем нормализации пробелов и пространств имен, которые делают его непригодным для сравнения. BinaryFormatter
и другие двоичные сериализаторы выглядят более заманчиво, но я не уверен, что они гарантируют поведение, которое вы ищете.
Я бы не стал доверять сравнению, выполненному с помощью такого подхода, если бы сериализатор явно не сделал эту гарантию.