我在C#/。NET中进行序列化时遇到问题,如果我在一个流中序列化对同一对象的多个引用,则在反序列化之后,这些引用将不再相等。我正在使用默认的二进制序列化。使我绊倒的代码是:
Check ck1 = new Check();
Check ck2 = new Check();
ck1.Numbers = new int[] { 11, 12, 13 };
ck2.Numbers = ck1.Numbers;
Console.WriteLine(ReferenceEquals(ck1.Numbers, ck2.Numbers));
FileStream fs = new FileStream("d:\\deleteme-check3.txt", FileMode.Create, FileAccess.Write);
BinaryFormatter oos = new BinaryFormatter();
oos.Serialize(fs, ck1);
oos.Serialize(fs, ck2);
fs.Flush();
fs.Close();
fs = new FileStream("d:\\deleteme-check3.txt", FileMode.Open, FileAccess.Read);
oos = new BinaryFormatter();
Check ck3 = (Check)oos.Deserialize(fs);
Check ck4 = (Check)oos.Deserialize(fs);
Console.WriteLine(ReferenceEquals(ck3.Numbers, ck4.Numbers));
声明是
[Serializable]
class Check
{
public int[] Numbers = new int[] { 0, 1, 2 };
}
运行此代码时,我得到True
和False
。我正在寻找可以使用的功能,这些功能可以帮助我True
和True
。
注意#1:我检查了有关使用DataContractSerializer
和的参考MarshalByRefObject
,但是我看不到如何将这些功能应用于此问题。
注意#2:我知道我可以编写自己的自定义序列化逻辑,但是我想避免这种情况,而是使用默认序列化。例如,如果我在Java中使用默认序列化,那么在这种情况下,我会得到的True
,True
并且我正在.NET中寻找类似的工具。
这根本不会发生。任何保留引用的语义仅对Serialize
/的单个调用有效Deserialize
。为了得到想要的东西,您需要使用某种包装器,即
[Serializable]
public class HazTwo {
public Check First {get;set;}
public Check Second {get;set;}
}
然后序列化:
var obj = new HazTwo { First = ck1, Second = ck2 };
oos.Serialize(fs, obj);
并反序列化:
var newObj = (HazTwo)oos.Deserialize(fs);
var ck3 = newObj.First;
var ck4 = newObj.Second;
引用的身份永远不会在对Serailize
或的单独调用之间保留Deserialize
,只有-的轻微例外,IObjectReference
但是由于数组未实现IObjectReference
,因此这很无聊。
坦白说,我怀疑您最好选择以下两种方法之一:
Serialize
/Deserialize
调用在起作用我还应该添加脚注,我通常建议人们不要过度使用BinaryForamtter
-我已经看到太多的人丢失数据或陷入混乱,通常是在他们的代码版本之间进行迭代时。改变不是很容易。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句