Domanda

Nella mia domanda ho una classe e la classe PacketList Packet. Mi piacerebbe essere in grado di utilizzare le guide di serializzazione su PacketList a venire con qualcosa di simile l'output desiderato, ma non hanno idea di quale direzione andare.

Sto scrivendo un programma di imitare un server che ha un protocollo particolare per l'invio dei dati.

Il client invia i dati con il formato: COMMAND|ARGUMENT_0|ARGUMENT_1|ARGUMENT_2|...|ARGUMENT_N\0. Dove COMMAND potrebbe essere qualcosa come MOVE o LOGIN.

Il server risponderà nel formato:

<p c='COUNT'>
    <m p='N' p0='COMMAND_0' p1='ARUGMENT_0' ... pN='ARGUMENT_N'/>
    <m p='N' p0='COMMAND_1' p1='ARUGMENT_0' ... pN='ARGUMENT_N'/>
    <m p='N' p0='COMMAND_2' p1='ARUGMENT_0' ... pN='ARGUMENT_N'/>
    <m p='N' p0='COMMAND_3' p1='ARUGMENT_0' ... pN='ARGUMENT_N'/>
    ...
    <m p='N' p0='COMMAND_COUNT' p1='ARUGMENT_0' ... pN='ARGUMENT_N'/>
</p>

Dove COMMAND_0 potrebbe essere qualcosa di simile a UPDATE_POSITION o AUTHENTICATED.

Sì, questo è un modo stupido di fare le cose. No, non so perché è fatto in questo modo. No, non posso cambiarlo.

In ogni modo, sto cercando di emulare il modo in cui il server invia il pacchetto al client. Quello che ho ottenuto finora è:

XmlWriterSettings _Settings = new XmlWriterSettings {
    OmitXmlDeclaration = true,
    Indent = true
};
StringBuilder _Xml = new StringBuilder();
XmlWriter _Writer = XmlWriter.Create(_Xml, _Settings);
_Writer.WriteStartElement("p");
    _Writer.WriteAttributeString("c", "1");
    _Writer.WriteStartElement("m");
        _Writer.WriteAttributeString("p", "2");
        _Writer.WriteAttributeString("p0", "COMMAND");
        _Writer.WriteAttributeString("p1", "ARGUMENT_0");
        _Writer.WriteAttributeString("p2", "ARGUMENT_1");
    _Writer.WriteEndElement(); // </m>
_Writer.WriteEndElement(); // </p>
_Writer.Flush();
Console.WriteLine(_Xml.ToString());

Questo funziona correttamente e uscite:

<p c="1">
  <m p="2" p0="COMMAND" p1="ARGUMENT_0" p2="ARGUMENT_1" />
</p>

Tuttavia, mi piacerebbe implementare questo in un modo più pulito.

Il mio PacketList contiene essenzialmente un elenco di Packets, e Packet contiene un String _Command e String[] _Arguments.

Se qualcuno mi potesse guidare nella giusta direzione, che sarebbe molto apprezzato.

È stato utile?

Soluzione

Il modo in cui si sta facendo è il migliore. Direi di utilizzare il XmlSerializer e decorare il vostro pacchetto e classe packetlist di proprietà con l'XML appropriato * attributo attributi per controllare il modo in cui l'uscita è formattato, ma dal momento che è necessario scrivere gli attributi corrispondenti a una raccolta (p0, p1, p2, ecc .) questo non funzionerà.

Dal momento che è necessario scrivere un formato così strana, ha senso scrivere manualmente il modo in cui ci si trova.

Andrew

Altri suggerimenti

I seconda risposta di Andrew.

Per quanto ne sappia, non c'è modo di farlo a meno che non si scrive il proprio serializzatore, dal momento che la composizione di due livelli di elementi di dati (con numero di dinamica di elementi!) Come attributi in un unico elemento XML. Non ha senso farlo, e, beh, XmlSerializer ha bisogno di alcuni senso al fine di lavorare utilizzando solo Riflessione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top