2010-02-10 3 views
8

Gelen sınıf isimlerini SerializationBinder kullanarak ve BindToType yöntemini kullanarak geçersiz kılabiliyorum, ancak serileştirme işleminde sınıfın adını değiştirmenin bir yolunu bulamadım. Bütün bunlar mümkün mü??Seri hale getirilen sınıfın adını .Net olarak değiştirin.

DÜZENLEME:

Ben System.Xml.SerializationSystem.Runtime.Serialization kullanarak serileştirme atıfta değilim ve.

Teşekkürler!

+0

neden bunu yapmak ister ki? Sık sık yapmaya çalıştığım şey için bir işlev/yöntem yoksa, çok daha basit bir çözümü kaçırdığımı ya da sadece garip şeyler yapmaya çalışıyorum. – Lazarus

+0

Sınıf adını bağımsız olarak serileştirme ve serpiştirme işlemini yapmak için bunu yapmak istiyorum, böylece sınıfı yeniden adlandırırsam veya sınıfın ad alanını değiştirirsem, serileştirme ve serpiştirme işlemi hiç değişmezdi. –

+0

Ne tür bir Serileştirme gerçekleştiriyorsunuz? İkili? Xml? Diğer? –

cevap

6

ben GetObjectData işlevinde geliyor SerializationInfo nesneyi kullanıyorum ve serisini zaman özel montaj ve tip-adını eşleştirmek için bir SerializationBinder kullanın böylece geri, AssemblyName ve FullTypeName özelliklerini değiştirebilirsiniz öğrendim geçerli bir tür.

Serializable sınıf:

[Serializable] 
class MyCustomClass : ISerializable 
{ 
    string _field; 
    void MyCustomClass(SerializationInfo info, StreamingContext context) 
    { 
     this._field = info.GetString("PropertyName"); 
    } 
    void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) 
    { 
     info.AssemblyName = "MyCustomAssemblyIdentifier"; 
     info.FullTypeName = "MyCustomTypeIdentifier"; 
     info.AddValue("PropertyName", this._field); 
    } 
} 

SerializationBinder:

public class MyBinder : SerializationBinder 
{ 
    public override Type BindToType(string assemblyName, string typeName) 
    { 
     if (assemblyName == "MyCustomAssemblyIdentifier") 
      if (typeName == "MyCustomTypeIdentifier") 
       return typeof(); 
     return null; 
    } 
} 

Serile kodu:

var fs = GetStream(); 
BinaryFormatter f = new BinaryFormatter(); 
f.Binder = new MyBinder(); 
var obj = (MyCustomClass)f.Deserialize(fs); 
İşte semple olduğunu 0

Seri kaldırma kodu: Bana tarif edebilir

var fs = GetStream(); 
MyCustomClass obj = GetObjectToSerialize(); 
BinaryFormatter f = new BinaryFormatter(); 
f.Deserialize(fs, obj); 
+0

, List ile beklenen şekilde çalışır mı? –

9

Seni takip ettiğimden emin değilim, ancak XmlTypeAttribute kullanabilirsiniz. Daha sonra değerlerini yansıma yoluyla kolayca alabilirsiniz.

[XmlType(Namespace = "myNamespaceThatWontChange", 
TypeName = "myClassThatWontChange")] 
public class Person 
{ 
    public string Name; 
} 

Kontrol şuna:

http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmltypeattribute%28VS.100%29.aspx

+0

Ancak bu XmlSerialization, SerializableAttribute ve ISerializable arabirimini kullanan serileştirme hakkında konuşuyorum. –

+0

İslam İbrahim'in cevabı, 'o zaman' cevabıdır (bildiğim kadarıyla). – Pedro

2

Sen özelliklere sahip yapabilirsiniz: suret + vekil seçici kullanılarak en

[System.Xml.Serialization.XmlRoot("xmlName")] 
public Class ClassName 
{ 
} 
0

bak. Deserialization üzerinde bir bağlayıcı ile birlikte hile yapmalısınız.

+0

Bu çok ilginç, ama aradığım şey bu değildi. GetObjectData'nun "SerializationInfo" nesnesini kullanabileceğimi ve hem AssemblyName hem de FullTypeName özelliklerini değiştirebileceğimi öğrendim. –

+1

Bu, örneklere kayıtsız bağlamları serileştirmeniz gerekebileceği için oldukça tehlikelidir. yani, katmanlar, klonlama, peris vb. arasındaki veri aktarımı. Eğer bu rotaya giderseniz, akış bağlamını belirttiğinizden emin olun. (örnek) formatter.Context = new System.Runtime.Serialization.StreamingContext (System.Runtime.Serialization.StreamingContextStates.CrossMachine); ve bunun için öğeleri adlandıracağınız bağlayıcıya bağlı olduğunuzu unutmayın. – MaLio