Как сделать тип значения nullable с.NET XmlSerializer?

попробуйте следующее:

import 'package:flutter/material.dart';
import 'dart:ui';
import 'dart:async';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Counter App',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Counter App'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> with TickerProviderStateMixin {
  int _counter = 0;
  AnimationController controller;

  Duration get duration => controller.duration * controller.value;

  bool get expired => duration.inSeconds == 0;

  @override
  void initState() {
    controller = AnimationController(
      vsync: this,
      duration: Duration(seconds: 20),
    );

    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: new Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            AnimatedBuilder(
              animation: controller,
            builder: (BuildContext context, Widget child) {
              return new Text(
                '${duration.inSeconds}',
                style: new TextStyle(
                  fontWeight: FontWeight.bold,
                  fontSize: 50.0,
                ),
              );
            }),
            new Row(
              mainAxisAlignment: MainAxisAlignment.spaceEvenly,
              children: <Widget>[
                new RaisedButton(
                  padding: const EdgeInsets.all(15.0),
                  textColor: Colors.white,
                  color: Colors.redAccent,
                  onPressed: () {
                    setState(() {
                      controller.reset();
                    });
                  },
                  child: new Text("Reset"),
                ),
              ],
            ),
          ],
        ),
      ),
      bottomNavigationBar: BottomAppBar(
        child: Container(
          height: 50.0,
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () => setState(() {

          controller.reverse(from: 1);
            }),
        tooltip: 'Increment Counter',
        child: Icon(Icons.add),
      ),
      floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
    );
  }
}
29
задан Bill the Lizard 9 October 2011 в 17:44
поделиться

5 ответов

Я просто обнаружил это. XmlSerialier ищет a XXXSpecified булево свойство, чтобы определить, должно ли это быть включено. Это должно решить проблему приятно.

[Serializable]
public class MyClass
{
  public int Age { get; set; }
  [XmlIgnore]
  public bool AgeSpecified { get { return Age >= 0; } }
  public int MyClassB { get; set; }
}

[Serializable]
public class MyClassB
{
  public int RandomNumber { get; set; }
}

Доказательство:

static string Serialize<T>(T obj)
{
  var serializer = new XmlSerializer(typeof(T));
  var builder = new StringBuilder();
  using (var writer = new StringWriter(builder))
  {
    serializer.Serialize(writer, obj);
    return builder.ToString();
  }
}

static void Main(string[] args)
{
  var withoutAge = new MyClass() { Age = -1 };
  var withAge = new MyClass() { Age = 20 };

  Serialize(withoutAge); // = <MyClass><MyClassB>0</MyClassB></MyClass>
  Serialize(withAge); // = <MyClass><Age>20</Age><MyClassB>0</MyClassB></MyClass>
}

Править: Да, это - зарегистрированная функция. Посмотрите запись MSDN для XmlSerializer

Другая опция состоит в том, чтобы использовать специальный шаблон, чтобы создать булево поле, распознанное XmlSerializer и применить XmlIgnoreAttribute к полю. Шаблон создается в форме propertyNameSpecified. Например, если бы существует поле под названием "MyFirstName", Вы также создали бы поле под названием "MyFirstNameSpecified", который сообщает XmlSerializer, генерировать ли элемент XML под названием "MyFirstName".

56
ответ дан Samuel 28 November 2019 в 01:01
поделиться

Это помогает, должен Сделать интервал Возраста? и..

public bool ShouldSerializeAge() { return Age.HasValue; }

.. это действительно означает добавлять методы ShouldSerializeXXX к Вашему классу!

2
ответ дан Dog Ears 28 November 2019 в 01:01
поделиться

Забудьте об Nullable ... ShouldSerializeXXX - прекрасное решение. Здесь Age будет сериализован в зависимости от вашего состояния.

[Serializable]
public class MyClass
{
    public int Age { get; set; }
    public int MyClassB { get; set; }

    #region Conditional Serialization
    public bool ShouldSerializeAge() { return age > 0; }
    #endregion
}

[Serializable]
public class MyClassB
{
    public int RandomNumber { get; set; }
}
0
ответ дан 28 November 2019 в 01:01
поделиться

Расширение ответа Самуэля и комментария Грега Бича на случай логического свойства: если свойство имеет тип bool, то вы можете ' • Напишите простой тест в свойстве propertySpecified.

Решение состоит в использовании типа Nullable , тогда тест в свойстве propertySpecified будет просто property.HasValue. например

using System.Xml.Serialization;

public class Person
{
    public bool? Employed { get; set; }

    [XmlIgnore]
    public bool EmployedSpecified { get { return Employed.HasValue; } }
}

Альтернативой использованию типа, допускающего значение NULL для числового свойства (предложенного Грегом Бичем), является установка для свойства value недопустимого значения по умолчанию, такого как -1, следующим образом:

using System.ComponentModel;
using System.Xml.Serialization;

public class Person
{
    [DefaultValue(-1)]
    public int Age { get; set; }

    [XmlIgnore]
    public bool AgeSpecified { get { return Age >= 0; } }
}
13
ответ дан 28 November 2019 в 01:01
поделиться

xsd.exe автоматически сгенерирует свойство XXXSpecified и средства доступа, если вы установите атрибут minoccurs как minoccurs = "0" 'для элемента ... если вы используете схему для определения вашего xml / класс

0
ответ дан 28 November 2019 в 01:01
поделиться
Другие вопросы по тегам:

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