Deserializacja xml Polimorfizm

0

Fragmenty xml (xml nie podlega zmianie)

Problemem jest fragment dotyczący adresu, jest oznaczony tak samo <tns:Adres

<tns:Adres xsi:type="tns:TAdresPolski">
      <tns:KodKraju>PL</tns:KodKraju>
      <tns:Miejscowosc>string</tns:Miejscowosc>
      <tns:Ulica>string</tns:Ulica>
      <tns:NrDomu>string</tns:NrDomu>
      <tns:KodPocztowy>13-551</tns:KodPocztowy>
    </tns:Adres>

lub

<tns:Adres xsi:type="tns:TAdresZagraniczny">
      <tns:KodKraju>MR</tns:KodKraju>
      <tns:Miejscowosc>string</tns:Miejscowosc>
      <tns:NrDomu>string</tns:NrDomu>
      <tns:NrLokalu>string</tns:NrLokalu>
      <tns:KodPocztowy>string</tns:KodPocztowy>
</tns:Adres>

Jest inny zestaw pól i inne określenie typu.

Chciałem wykorzystać polimorfizm i stworzyłem hierarchię klas

[Guid("80FAE6C3-DD76-44DE-8F18-95DB45AD0124")]
    [ClassInterface(ClassInterfaceType.None)]
    [ComVisible(true)]
    [XmlTypeAttribute(TypeName = "TAdresPolski", Namespace = "http://ksef.mf.gov.pl/wzor/2021/08/05/08051/")]<---- TOTOTOTOTOTO
    public class ADRES : IADRES
    {
        string kodkraju = "ADRES";
        string miejscowosc = "ADRES";
        string ulica = "ADRES";
        string nrdomu = "ADRES";
        string kodpocztowy = "ADRES";
        public string KodKraju { get { return kodkraju; } set { kodkraju = value; } }
        public string Miejscowosc { get { return miejscowosc; } set { miejscowosc = value; } }
        public string Ulica { get { return ulica; } set { ulica = value; } }
        public string NrDomu { get { return nrdomu; } set { nrdomu = value; } }
        public string KodPocztowy { get { return kodpocztowy; } set { kodpocztowy = value; } }
    }
[Guid("CF46E019-0A0F-418A-8BE0-71BB9E2839F9")]
    [ClassInterface(ClassInterfaceType.None)]
    [ComVisible(true)]
    public class ADRESPOLSKI : ADRES,IADRESPOLSKI
    {
        string kodkraju = "ADRESPOLSKI";
        string miejscowosc = "ADRESPOLSKI";
        string ulica = "ADRESPOLSKI";
        string nrdomu = "ADRESPOLSKI";
        string kodpocztowy = "ADRESPOLSKI";
        public string KodKraju { get { return kodkraju; } set { kodkraju = value; } }
        public string Miejscowosc { get { return miejscowosc; } set { miejscowosc = value; } }
        public string Ulica { get { return ulica; } set { ulica = value; } }
        public string NrDomu { get { return nrdomu; } set { nrdomu = value; } }
        public string KodPocztowy { get { return kodpocztowy; } set { kodpocztowy = value; } }
    }

[Guid("0AC12F3C-B03F-42A2-AB5F-51298F2FEE1B")]
    [ClassInterface(ClassInterfaceType.None)]
    [ComVisible(true)]
    public class ADRESZAGRANICZNY : ADRES,IADRESZAGRANICZNY
    {
        string kodkraju { get; set; }
        string miejscowosc { get; set; }
        string ulica { get; set; }
        string nrdomu { get; set; }
        string kodpocztowy { get; set; }
        public string KodKraju { get { return kodkraju; } set { kodkraju = value; } }
        public string Miejscowosc { get { return miejscowosc; } set { miejscowosc = value; } }
        public string Ulica { get { return ulica; } set { ulica = value; } }
        public string NrDomu { get { return nrdomu; } set { nrdomu = value; } }
        public string KodPocztowy { get { return kodpocztowy; } set { kodpocztowy = value; } }
    }

Ta hierarchia ma być dostępna poprzez bibliotekę typów (COM) dlatego GUID i [ComVisible(true)] itd.

Podsumowując
ADRESPOLSKI dziedziczy po ADRES
ADRESZAGRANICZNY dziedziczy po ADRES

Wszystko działa poza deserializacją w wierszu
<Adres xsi:type="tns:TAdresPolski">
lub
<Adres xsi:type="tns:TAdresZagraniczny">

jak usuwam linię kodu oznaczoną <---- TOTOTOTOTOTO to dostaje przy deserializacji, że nie rozpoznano typu TAdresPolski

Gdy dodaję tę linię to się deserializuje i jest ok

ale muszę przewidzieć TAdresZagraniczny, a nie mogę dodać kolejnego wpisu

 [XmlTypeAttribute(TypeName = "<u>TAdresZagraniczny</u>", Namespace = "http://ksef.mf.gov.pl/wzor/2021/08/05/08051/")]

Pytanie:
Jakie atrybuty i gdzie należy użyć aby to się prawidłowo deserializowało?

1

Ręcznie kodujesz te klasy?

jestem zdziwiony, w tym dziwnym kraju ale jednak wdrożenia MF maja całkiem poprawne fundamenty techniczne (np są znacznie lepsze od tzw "sprawiedliwości"), i klasy się ślicznie generują ze schemy.

xsd /c /namespace:whatever.generatedKR ElementarneTypyDanych_v4-0E.xsd KodyKrajow_v4-1E.xsd KodyUrzedowSkarbowych_v4-0E.xsd StrukturyDanych_v4-0E.xsd KodyCechKrajow_v3-0E.xsd  ...

0

Tak, ręcznie.
Automat nie rozpoznaje rozróżnienia na 2 rodzaje adresu.

0 użytkowników online, w tym zalogowanych: 0, gości: 0