Como he explicado en el comentario de que la cuestión de forma, se produce el problema (al menos el caso he descubierto) por la optimización de la cadena de salida. Parece que si las cadenas son la misma referencia, entonces se emitirá una vez.
Así que lo que el código de ejemplo lo hace para utilizar una cadena larga para las propiedades de un objeto y cambiar la referencia de una cadena y luego serializar. A continuación, deserialice la transmisión de nuevo a objeto (y esta vez ya que la cadena está intervenida, se utiliza la misma referencia) y luego vuelva a serializar. Esta vez, la secuencia es más pequeña.
OK, aquí es el código de la prueba:
[Serializable]
public class Proof
{
public string S1 { get; set; }
public string S2 { get; set; }
public string S3 { get; set; }
}
class Program
{
static void Main(string[] args)
{
const string LongString =
"A value that is going to change the world nad iasjdsioajdsadj sai sioadj sioadj siopajsa iopsja iosadio jsadiojasd ";
var proof = new Proof() {
S1 = LongString,
S2 = LongString,
S3 = LongString
};
proof.S2 = LongString.Substring(0, 10) + LongString.Substring(10); // just add up first 10 character with the rest.
//This just makes sure reference is not the same although values will be
Console.WriteLine(proof.S1 == proof.S2);
Console.WriteLine(proof.S1 == proof.S3);
Console.WriteLine(proof.S2 == proof.S3);
Console.WriteLine("So the values are all the same...");
BinaryFormatter bf = new BinaryFormatter();
MemoryStream stream = new MemoryStream();
bf.Serialize(stream, proof);
byte[] buffer = stream.ToArray();
Console.WriteLine("buffer length is " + buffer.Length); // outputs 449 on my machine
stream.Position = 0;
var deserProof = (Proof) bf.Deserialize(new MemoryStream(buffer));
deserProof.S1 = deserProof.S2;
deserProof.S3 = deserProof.S2;
MemoryStream stream2 = new MemoryStream();
new BinaryFormatter().Serialize(stream2, deserProof);
Console.WriteLine("buffer length now is " + stream2.ToArray().Length); // outputs 333 on my machine!!
Console.WriteLine("What? I cannot believe my eyes! Someone help me ........");
Console.Read();
}
bien, parece que tengo que probarlo. ** Trataré de hacer una aplicación de muestra. ** – Aliostad
No creo que sea el caso. Las instancias de flujo pueden ser diferentes, pero el contenido debe ser el mismo. Suponiendo que su estado no se modifique durante la serialización. – Ian
@Ian ver mi código de muestra para crearlo. – Aliostad