// Deserialize T from IBonded<T> containing an instance or payload of derived class. void BondedDeserialize <T, D>() where T : class where D : class, T, new() { var from = Random.Init <D>(); IBonded <T> bondedInstance = new Bonded <D>(from); IBonded <T> bondedPayloadCB = Util.MakeBondedCB(from); IBonded <T> bondedPayloadCB2 = Util.MakeBondedCB2(from); IBonded <T> bondedPayloadSP = Util.MakeBondedSP(from); IBonded <BondClass <IBonded <T> > > nestedBonded = new Bonded <BondClass <IBonded <T> > >(new BondClass <IBonded <T> > { field = bondedInstance }); for (var i = 2; --i != 0;) { var to1 = bondedInstance.Deserialize(); var to2 = bondedPayloadCB.Deserialize(); var toCb2 = bondedPayloadCB2.Deserialize(); var to3 = bondedPayloadSP.Deserialize(); Assert.IsTrue(to1.IsEqual <T>(from)); Assert.IsTrue(to2.IsEqual <T>(from)); Assert.IsTrue(toCb2.IsEqual <T>(from)); Assert.IsTrue(to3.IsEqual <T>(from)); Assert.IsTrue(nestedBonded.Deserialize().field.Deserialize().IsEqual(from)); } }
// Deserialize derived class from IBonded<T> containing an instance or payload of derived class. void BondedDowncastDeserialize <T, D>() where T : class where D : class, T, new() { var from = Random.Init <D>(); IBonded <T> bondedInstance = new Bonded <D>(from); IBonded <T> bondedPayloadCB = Util.MakeBondedCB(from); IBonded <T> bondedPayloadSP = Util.MakeBondedSP(from); for (var i = 2; --i != 0;) { var to1 = bondedInstance.Deserialize <D>(); var to2 = bondedPayloadCB.Deserialize <D>(); var to3 = bondedPayloadSP.Deserialize <D>(); Assert.IsTrue(to1.IsEqual <D>(from)); Assert.IsTrue(to2.IsEqual <D>(from)); Assert.IsTrue(to3.IsEqual <D>(from)); } }