2011-09-12 19 views
12

DataContractJsonSerializer kullanıyorum ve DataMember Name ile ilgili bir sorun yaşıyorum.Serialization DataMember (name) geçersiz kılma sorunu

Temel sınıf ve çeşitli türetilmiş sınıflar yaptım. Türetilmiş sınıflara ihtiyacım var çünkü farklı json dizeleri var. Json dizilerini serileştirmek istiyorum ve bu yüzden veri elemanları için farklı isimlere ihtiyaç duyuyorum. Aşağıdaki örnekte olduğu gibi DataMember adını değiştirmeye çalıştığınızda:

AnaSınıf:

[DataContract] 
public abstract class BaseClass 
{ 


    [DataMember] 
    public virtual string FirstMethod { get; protected set; } 

} 

Türetilmiş sınıfı:

[DataContract] 
[KnownType(typeof(BaseAccess))] 
public class DerivedClass 
{ 


    [DataMember(Name="first_method")] 
    public virtual string FirstMethod { get; protected set; } 

} 

Sorun türetilmiş bir sınıf kullandığınızda seri görmezden görünüyor olmasıdır Verilen DataMember adı. Dolayısıyla, türetilmiş türetme ile serileştirdiğimde, serileştirme "türetilmiş sınıfın" yerine "ilk_method" yerine "İlkMethod" (temel sınıfın) adıyla yer alır gibi görünmektedir. Türetilmiş sınıfın DataMember isminin kullanılması mümkündür (durumumdaki türetilmiş sınıflar için farklıdır).

Başka bir soru. Baz sınıfında KnownType eklenen örnekler buldum ve türetilmiş sınıfa ekledim. Benim için mantıksal sınıfta (özellikle mirasla ilgili endişeler için) mantığa benziyor. Ne doğru?

cevap

7

Aynı sorunu yaşadım. Ben VB.NET kullanıyordum ve benim türetilmiş sınıfta DataMember özelliği saygı WCF almak için özellik Shadow (veya aşırı yük) vardı. C# 'da yeni operatörü kullanabilmeniz gerekir.

public class DerivedClass 
{ 
    [DataMember(Name = "first_method")] 
    new public string FirstMethod { get; protected set; } 
} 
+0

Not Eğer temel sınıfta özelliğinden [DataMember] özelliğini kaldırmak gerekir. –

3

hüner temel sınıfın sanal veri üyesi için EmitDefaultValue = false belirtmektir ve türetilmiş sınıf dönüş varsayılan değer onun uygulanmasında veri üyesi tefrika değildir bu yüzden. Türetilmiş sınıfta, gerekli adı taşıyan başka bir veri üyesi tanımlayın. senin json iki alan yaratmaktan kaçınmak için

[DataContract(Name = "baseclass", Namespace = "")] 
[KnownType(typeof(DerivedClass))] 
public class BaseClass 
{ 
    [DataMember(Name = "attributes", EmitDefaultValue = false)] 
    public virtual SomeType Fields { get; set; } 
} 

[DataContract(Name = "derivedclass", Namespace = "")] 
public class DerivedClass : BaseClass 
{ 
    public override SomeType Fields 
    { 
     get { return null; } 
    } 

    [DataMember(Name = "fields")] 
    public SomeType DerivedFields 
    { 
     get { return base.Fields; } 
    } 
}