Serializacja do XML i blokowanie ustawiania zmiennych

0

Witam, ostatnio natknąłem się na przedziwny problem, otóż napisałem klasę która ma za zadanie szyfrować o odszyfrowywać informację, oraz umożliwiać serialkizację do XML zakodowanych informacji, oczywiście po wczytaniu pliku XML i deserializacji jest mozliwość odszyfrowania informacji po podaniu klucza użytego podczas szyfrowania, wszytsko niby działa ok ale jedna rzecz mnie strasznie irytuje, otóż atrybuty poddawane serializacji musza być publiczne (to rozumiem) a dokładniej gettery i settery, z getterem to oczywiście jestem w stanie to zrozumieć no bo podczas serializacji obiekt serializujący XMLSerializer musi pobrac odpowiednie informacje aby je "zapisać" natomiast to co mnie po czesci dziwi i zaskkakuje to to że setter także musi być publiczny przez co obiekt jest narazony na wprowadzanie "błędów" poniewaz po pomyslnym podaniu potrzebnych informacji jest mozliwość zmiany poszczególnych elementów, które nie powiunny być zmieniane ... nie wiem czy do końca dobrze wytłumaczyłem?!

POnizej kod:

 
 [Serializable]
    public sealed class Data
    {
        #region Class Attribute (private)

        private string myData { get; set; }

        private string myKey { get; set; }

        #endregion

        #region Class Attribute (read only, get only)

        [XmlAttribute("DATA")]
        public string DataName { get; set; }

        [XmlElement("BYTE_DATA")]
        public byte[] DataEncrypt { get; set; }

        [XmlElement("DATE")]
        public string DataDate { get; set; }

        [XmlElement("USER_ID")]
        public int UserID { get; set; }

        #endregion

        #region Class Constructor

        public Data()
        {
            DataDate = DateTime.Now.ToUniversalTime().ToString();
            myData = null;
            myKey = null;
            UserID = -1;
            DataName = null;
            DataEncrypt = null;
        }

        public Data(string dataToEncrypt, string keyEncrypt, int userID, string dataName)
        {
            DataDate = DateTime.Now.ToUniversalTime().ToString();
            myData = dataToEncrypt;
            myKey = keyEncrypt;
            UserID = UserID;
            DataName = dataName;
            DataEncrypt = EncryptData();
        }

        #endregion

        #region Class Public Interfaces

        public void SetData(string dataToEncrypt, string keyEncrypt, int userID, string dataName)
        {
            myData = dataToEncrypt;
            myKey = keyEncrypt;
            UserID = UserID;
            DataName = dataName;
            DataEncrypt = EncryptData();
        }

        public string GetData(string KeyEncrypt)
        {
            string dataResult = null;
            string result = null;

            if (DataEncrypt == null)
            {
                result = EnumHelper.GetDescription(ErrorList.DataErrors.DATA_NULL);
            }
            else
            {
                if (KeyEncrypt == myKey)
                {
                    dataResult = DecryptData(KeyEncrypt);
                    if (dataResult.GetHashCode() == myData.GetHashCode())
                    {
                        result = dataResult;
                    }
                    else
                    {
                        result = EnumHelper.GetDescription(ErrorList.DataErrors.HASH_INCORRECT);
                    }
                }
                else
                {
                    result = EnumHelper.GetDescription(ErrorList.DataErrors.WRONG_KEY);
                }
            }

            return result;
        }

        #endregion

        #region Class Implementation

        private byte[] EncryptData()
        {
            byte[] result;

            if (myData == null && myKey == null && UserID < 0 && DataName == null)
            {
                result = null;
            }
            else
            {
                const int rsa = 1;
                var cspParameters = new CspParameters(rsa);
                cspParameters.Flags = CspProviderFlags.UseMachineKeyStore;
                cspParameters.KeyContainerName = myKey;
                var rsaCryptoServiceProvider = new RSACryptoServiceProvider(cspParameters);
                result = rsaCryptoServiceProvider.Encrypt(new UnicodeEncoding().GetBytes(myData), true);
            }

            return result;
        }

        private string DecryptData(string _KeyEncrypt)
        {
            string result = null;

            const int rsa = 1;
            var cspParameters = new CspParameters(rsa);
            cspParameters.Flags = CspProviderFlags.UseMachineKeyStore;
            cspParameters.KeyContainerName = _KeyEncrypt;
            var rsaCryptoServiceProvider = new RSACryptoServiceProvider(cspParameters);
            var decrypted = rsaCryptoServiceProvider.Decrypt(DataEncrypt, true);

            result = new UnicodeEncoding().GetString(decrypted);
            return result;
        }

        #endregion
    }

Teraz pytanie, czy jest mozliwość zablokowania w jakiś sposób mozliwości zmiany atrybutów klasy (publicznych) lub wymuszenie użycia metody ustawiającej?

Pozdro
Oskar

0

Teraz pytanie, czy jest mozliwość zablokowania w jakiś sposób mozliwości zmiany atrybutów klasy (publicznych) lub wymuszenie użycia metody ustawiającej?

Hmm, readonly?

Readonly

0

Podczas serializacji wywala błąd że atrybut jest readony - już to testowałem, w sumie w pierwotnej wersji klasy miałem wszytskie serializowane informacje ustawione na readonly no i nie działa, jak uzyje:

 
public string MojAtrybutDoSerializacji {get; private set;}

To tez zgłasza błąd :(

Jakieś pomysły jak zablokować opcje wprowadzania nieautoryzowanych zmian w serializowanych atrybutach?

0

@osamex, idziesz w zupełnie odwrotną stronę niż powinieneś. ;)
Jeśli nie chcesz, aby zmiana wartości pola czy też właściwości była możliwa z zewnątrz klasy, to musisz użyć modyfikatora dostępu private. Co za tym idzie, aby móc je serializować do XML, nie możesz użyć standardowego mechanizmu, lecz napisać własny. O ile dobrze pamiętam, to służy do tego interfejs IXmlSerializable.

0

Dzięki już zaczynam zgłebiać tajniki interfejsu IXMLSerializable

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