Упорядочивание сериализации.NET

У меня была такая же проблема. Я обнаружил, что если к сервису GoogleApiClient подключено и все еще происходит обновление местоположения, stopService() не имеет никакого эффекта, отрасль сервиса () не была вызвана. Чтобы устранить проблему, я создал функцию остановки службы определения местоположения в коде службы. Вызовите stopLocationService() из действия, а затем вызовите stopService. Вот пример кода:

public class myLocationService extends Service{
...

    public void stopLocationUpdates() {

        LocationService.FusedLocationApi.removeLocationUpdates(mGoogleApiClient,this);       
        mGoogleApiClient.disconnect();

    }
    ...
} 

В деятельности,

{
    ...
    if(mService != null && isBound) {

        mService.stopLocationUpdates();
        doUnbindService();
        stopService(new Intent(this,   myLocationService.class));

     }
     ...
} 
14
задан Sander Rijken 19 June 2009 в 22:16
поделиться

3 ответа

Похоже, что класс XmlSerializer сериализует базовый тип, а затем производные типы в этом порядке и учитывает только свойство Order внутри каждого класса отдельно. Несмотря на то, что порядок не совсем такой, какой вы хотите, он все равно должен десериализоваться должным образом. Если вам действительно нужен именно такой порядок, вам нужно будет написать собственный сериализатор xml. Я бы предостерегал от этого, поскольку .NET XmlSerializer выполняет за вас множество специальных операций. Можете ли вы описать, зачем вам нужны вещи в указанном вами порядке?

3
ответ дан 1 December 2019 в 08:53
поделиться

РЕДАКТИРОВАТЬ: Этот подход не работает . Я оставил этот пост, чтобы люди могли избежать такого образа мыслей.

Сериализатор действует рекурсивно. В этом есть преимущество; при десериализации процесс десериализации может читать базовый класс, а затем производный класс. Это означает, что свойство в производном классе не устанавливается перед свойствами в основе, что может привести к проблемам.

Если это действительно имеет значение (и я не уверен, почему важно приводить их в порядок), тогда вы можете попробовать это -

1) сделайте базовый класс Property1 и Property3 виртуальным. 2) замените их тривиальными свойствами в производном классе. Например,

public class SerializableBase
{
    [XmlElement(Order = 1)]
    public virtual bool Property1 { get; set;}

    [XmlElement(Order = 3)]
    public virtual bool Property3 { get; set;}
}

[XmlRoot("Object")]
public class SerializableObject1 : SerializableBase
{
}

[XmlRoot("Object")]
public class SerializableObject2 : SerializableBase
{
    [XmlElement(Order = 1)]
    public override bool Property1 
    { 
      get { return base.Property1; }
      set { base.Property1 = value; }
    }

    [XmlElement(Order = 2)]
    public bool Property2 { get; set;}

    [XmlElement(Order = 3)]
    public override bool Property3
    { 
      get { return base.Property3; }
      set { base.Property3 = value; }
    }

}

Это ставит конкретную реализацию свойства в самый производный класс, и порядок должен соблюдаться.

4
ответ дан 1 December 2019 в 08:53
поделиться

Технически, с точки зрения чистого xml, я бы сказал, что это, вероятно, нежелание делать.

.NET скрывает большую часть сложности таких вещей, как XmlSerialization - в данном случае он скрывает схему для которому должен соответствовать ваш сериализованный xml.

В предполагаемой схеме будут использоваться элементы последовательности для описания базового типа и типов расширения. Это требует строгого упорядочения - даже если десериализатор менее строг и принимает неупорядоченные элементы.

В xml-схемах при определении типов расширения дополнительные элементы из дочернего класса должны располагаться после элементов из базового класса.

у вас будет схема, которая выглядит примерно так (теги xml-y удалены для ясности)

base
  sequence
    prop1
    prop3

derived1 extends base
  sequence
    <empty>

derived2 extends base
  sequence
    prop2

Вот ' s нет способа вставить заполнитель между prop1 и prop3, чтобы указать, куда могут идти свойства из производного xml.

В конце концов, у вас есть несоответствие между вашим форматом данных и вашим бизнес-объектом. Вероятно, лучшей альтернативой является определение объекта для работы с XML-сериализацией.

Например

[XmlRoot("Object")
public class SerializableObjectForPersistance
{
    [XmlElement(Order = 1)]
    public bool Property1 { get; set; }

    [XmlElement(Order = 2, IsNullable=true)]
    public bool Property2 { get; set; }

    [XmlElement(Order = 3)]
    public bool Property3 { get; set; }
}

Это отделяет ваш XML-код сериализации от вашей объектной модели. Скопируйте все значения из SerializableObject1 или SerializableObject2 в SerializableObjectForPersistance, а затем сериализуйте его.

По сути, если вам нужен такой специфический контроль над форматом вашего сериализованного xml, который не совсем соответствует ожиданиям платформы сериализации xml, вам необходимо: разделите дизайн вашего бизнес-объекта (в данном случае структуру наследования) и ответственность за сериализацию этого бизнес-объекта.

В конце концов, у вас есть несоответствие между вашим форматом данных и вашим бизнес-объектом. Вероятно, лучшей альтернативой является определение объекта для работы с XML-сериализацией.

Например

[XmlRoot("Object")
public class SerializableObjectForPersistance
{
    [XmlElement(Order = 1)]
    public bool Property1 { get; set; }

    [XmlElement(Order = 2, IsNullable=true)]
    public bool Property2 { get; set; }

    [XmlElement(Order = 3)]
    public bool Property3 { get; set; }
}

Это отделяет ваш XML-код сериализации от вашей объектной модели. Скопируйте все значения из SerializableObject1 или SerializableObject2 в SerializableObjectForPersistance, а затем сериализуйте его.

По сути, если вам нужен такой специфический контроль над форматом вашего сериализованного xml, который не совсем соответствует ожиданиям платформы сериализации xml, вам необходимо: разделите дизайн вашего бизнес-объекта (в данном случае структуру наследования) и ответственность за сериализацию этого бизнес-объекта.

В конце концов, у вас есть несоответствие между вашим форматом данных и вашим бизнес-объектом. Вероятно, лучшей альтернативой является определение объекта для работы с XML-сериализацией.

Например

[XmlRoot("Object")
public class SerializableObjectForPersistance
{
    [XmlElement(Order = 1)]
    public bool Property1 { get; set; }

    [XmlElement(Order = 2, IsNullable=true)]
    public bool Property2 { get; set; }

    [XmlElement(Order = 3)]
    public bool Property3 { get; set; }
}

Это отделяет ваш XML-код сериализации от вашей объектной модели. Скопируйте все значения из SerializableObject1 или SerializableObject2 в SerializableObjectForPersistance, а затем сериализуйте его.

По сути, если вам нужен такой специфический контроль над форматом вашего сериализованного xml, который не совсем соответствует ожиданиям платформы сериализации xml, вам необходимо: разделите дизайн вашего бизнес-объекта (в данном случае структуру наследования) и ответственность за сериализацию этого бизнес-объекта.

Вероятно, лучшей альтернативой является определение объекта для работы с XML-сериализацией.

Например

[XmlRoot("Object")
public class SerializableObjectForPersistance
{
    [XmlElement(Order = 1)]
    public bool Property1 { get; set; }

    [XmlElement(Order = 2, IsNullable=true)]
    public bool Property2 { get; set; }

    [XmlElement(Order = 3)]
    public bool Property3 { get; set; }
}

Это отделяет ваш XML-код сериализации от вашей объектной модели. Скопируйте все значения из SerializableObject1 или SerializableObject2 в SerializableObjectForPersistance, а затем сериализуйте его.

По сути, если вам нужен такой специфический контроль над форматом вашего сериализованного xml, который не совсем соответствует ожиданиям платформы сериализации xml, вам необходимо: разделите дизайн вашего бизнес-объекта (в данном случае структуру наследования) и ответственность за сериализацию этого бизнес-объекта.

Вероятно, лучшей альтернативой является определение объекта для работы с XML-сериализацией.

Например

[XmlRoot("Object")
public class SerializableObjectForPersistance
{
    [XmlElement(Order = 1)]
    public bool Property1 { get; set; }

    [XmlElement(Order = 2, IsNullable=true)]
    public bool Property2 { get; set; }

    [XmlElement(Order = 3)]
    public bool Property3 { get; set; }
}

Это отделяет ваш XML-код сериализации от вашей объектной модели. Скопируйте все значения из SerializableObject1 или SerializableObject2 в SerializableObjectForPersistance, а затем сериализуйте его.

По сути, если вам нужен такой специфический контроль над форматом вашего сериализованного xml, который не совсем соответствует ожиданиям платформы сериализации xml, вам необходимо: разделите дизайн вашего бизнес-объекта (в данном случае структуру наследования) и ответственность за сериализацию этого бизнес-объекта.

19
ответ дан 1 December 2019 в 08:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: